Changelog
All notable changes to SilverNode are documented here.
[0.9.4] - 2026-10-20
🚨 Demosaic Hotpatch! A bug in Halide’s OpenCL codegen caused the previous version to incorrectly demosaic your photos.
A release about finding your photos: the file browser lists folders in order and says how many RAW files each one holds.
🐛 Fixed
- RAW demosaicing fixed on OpenCL; this was a bug in the OpenCL backend of Halide.
🚀 Added
- RAW file counts in the file browser. Every folder shows on the right of its row how many RAW files it holds, so you can see where the photos are before opening anything. Folders you haven’t opened yet are counted in the background, after everything else SilverNode is doing. The count makes way for the Open button when you hover the row, and a folder without RAW files shows none.
🔧 Changed
- The file browser lists folders alphabetically, upper and lower case together, instead of in whatever order the disk kept them.
- Scrollbars no longer cover what they scroll. Lists and panels that scroll leave room beside the scrollbar, so the end of a row, like a folder’s RAW file count, stays readable.
[0.9.3] - 2026-10-19
A release about choices: alternative edits of one photo, a white balance picker, skin tone tools on the vectorscope, three new export formats, and tooltips on every control that needs one.
🚀 Added
- Alternative edits. A photo can have several edits side by side: the Edits button in Develop’s toolbar makes, opens, renames and deletes them, and decides which ones also show up in the Grid. The button says which edit is open (“Edits (2/3)”), a Grid tile shows a stack and how many edits its photo has, and the Grid outlines the edits of one photo that sit next to each other. The crown on an edit makes it the only one of its photo in the Grid. Shift+1 to Shift+5 open the first five edits, and the rest is under Photo > Edits. Undo stays on the edit you made the change on, and exports named after the file use the edit’s name, or the file name with an “_N” suffix when the photo has several edits.
- White balance picker. A square follows the pointer over the photo, and a click makes what is under it neutral, whatever white balance the photo already had. Next to the square it shows the temperature and tint a click would give. Take it out with I, Shift+T, Develop > Pick white balance or the eyedropper beside Temperature and Tint; the scroll wheel and [ ] size the square, and Escape, a right click or I put it away. With Preview while picking white balance on, or while Shift is held, the photo shows the result as the square moves.
- Skin Tones. Three sliders under Primary Calibration, made for putting skin on the vectorscope’s skin-tone line: Skin Hue turns skin tones together, Unify Reds and Unify Yellows pull the reddish or yellowish side of skin toward the line. Holding Escape over them shows the photo without them, leaving the rest of the primary calibration on.
- Faces on the vectorscope. Each face the AI detected is drawn on the vectorscope as the spread of its colors, so you can see where skin lands next to the skin-tone line. Vectorscope face sampling in the settings sets how finely each face is sampled.
- New export formats. WebP, about a third smaller than JPEG 4:2:0 for the same fidelity, with EXIF; WebP lossless, every pixel kept and about 15% smaller than PNG; and EXR, linear light as the scene had it, before the tone curve and with highlights brighter than white kept, for lighting 3D scenes and compositing. JPEG comes as two formats, JPEG 4:4:4 and JPEG 4:2:0. Above quality 95 the export panel says what the extra size buys: nothing anyone can see, at about three times the bytes at 100.
- Tooltips. Toolbar and panel buttons that run a command show its name, icon and every key bound to it, and the controls that don’t explain themselves say what they are. Every adjustment’s tooltip says what it does technically: what it works on, in which space or unit, and what its ends mean. The Tips button’s tooltip lists the tips on offer. All of it in every language.
- A rubber band for key drags. While a key drag with the Blender-style bindings hides the pointer, a band stretches from where it went into hiding to where it is now. Show a rubber band during a key drag in the settings turns it off.
- Shift locks a Blender-style drag to one axis, where the drag drives two values: the values snap to the cross through where the drag started.
- Rating and shot info above the quick preview, in fixed places so they don’t move while you flip through photos or rate them.
- Grid grouping commands. Grouping the Grid and jumping between its groups are commands under View; Cmd+PageUp and Cmd+PageDown jump to the previous and next group as shown on screen, skipping empty ones.
- On macOS, the window’s three buttons sit in the toolbar, left of the logo, and the toolbar drags the window as a title bar would.
🔧 Changed
- A Develop menu, next to Photo, holds what changes how a photo looks: rotating, resetting, copying and pasting adjustments, the white balance picker and AutoEdit. Photo keeps the photos themselves; Select all and Clear selection moved into it, and the Select menu is gone.
- Export to clipboard always writes files and puts them on the clipboard, a single photo too, so what you paste keeps its file name, format and EXIF.
- JPEG 4:2:0 is the export format chosen to start with, in the export panel and for every quick export.
- JPEG 4:4:4 files are about half the size: they are now stored as YCbCr, as JPEG 4:2:0 already was, with no difference anyone can see.
- The color wheels have yellow up and blue down, as the vectorscope has them. Your edits look the same.
- A prettier Light color scheme: paper rather than concrete, with lighter popups, quieter widgets and near-black text.
- AutoEdit aims skin a little more toward magenta.
- The skin-tone line on the vectorscope sits at 45 degrees, where the video convention and skin measurements put it.
⚡ Performance
- The photo you edit no longer waits behind loading thumbnails. It always gets a slot to render in, so Grid edits with the Blender-style bindings stay smooth when only a few photos may be processed at once.
- Faster demosaicing.
- A smaller program: SilverNode itself is about 15% smaller than in v0.9.2: 16% on Windows and Linux PCs and on Apple Silicon Macs, 18% on Intel Macs, and 9% on ARM Windows and Linux. The downloads are 4 to 8% smaller.
🐛 Fixed
- Exporting with Save EXIF metadata turned off no longer crashes.
- Colors of DNG files above 2900 K. Most DNGs carry two color calibrations, under tungsten and daylight; the daylight one was never blended in, so every photo warmer-lit than tungsten was rendered with the tungsten matrix alone.
- Colors of cameras with two calibrations. The two were blended at different scales, the larger pulling every color its way, and the as-shot white balance stopped short of settling.
- Primary Calibration works as intended. Its math had been wrong since it was added, so edits that use it may look different now.
- Quitting is quick. It no longer finishes the loads and renders of every queued photo first, which took as long as loading a large folder, and a photo paused in the Grid could make it hang for good.
- A thumbnail you edit while it is rendering is rendered again, instead of keeping the old picture.
- The before/after fade keeps the crop’s shape. Halfway through, the crop collapsed to a sliver, and the before view now fits the whole uncropped photo to the screen.
- A click on the very middle of a pie menu runs its center item: the copy menu’s Copy! did nothing.
- The usage hints popup lets keyboard shortcuts through to the rest of SilverNode while it is open.
- Crash reports from macOS have a stack trace again, which makes them useful for finding what went wrong.
[0.9.2] - 2026-10-02
A release about how SilverNode looks and how it is reached: two new looks for the interface, the gradient actions in the command palette, and smoother scrolling through the adjustments.
🚀 Added
- Very dark colors. A near-black color scheme with dimmed text, for editing in a dim room: Colors: Very dark in the View menu. A new setting, Auto: dark color scheme, picks whether Auto turns to Dark or to Very dark when your system is dark.
- The Darkroom theme. A new look for the whole interface, next to Modern and Blender, after the instruments of a photographic darkroom: lens-scale sliders with a detent at their default, glowing neon accents on deep indigo, cut corners, and curves drawn as a lit scope trace. Pick Theme: Darkroom in the View menu; switching themes keeps your color scheme and accent color.
- The gradient actions are commands. Adding a linear, radial or outside radial gradient, and deleting, resetting, inverting or duplicating the selected one, are now in the command palette while gradient mode is on, and can be bound to a key. Every pie menu now runs the same commands as the menus and the keys, so an action does the same thing however you reach it.
- Start-up options.
--fullscreen=<display> opens fullscreen on a given display, by its number or (part of) its name, and --list-displays lists them. --ui-scale and --fps set the interface scale and the frame rate limit for one session, without changing your settings.
🔧 Changed
- Blender-style bindings drive both values of a pair at once by default: up and down for the first, sideways for the second, so Temperature and Tint, or a strength and its radius, are set in one motion. The other behaviours are still in the settings, and a behaviour you chose before stays as it was.
- Reset All in Develop’s right-click menu now leaves the rotation alone, as it already did in the Grid and in the Photo menu.
- The interface contrast setting is gone: each color scheme now sets the contrast between panels itself.
⚡ Performance
- Scrolling through the adjustments no longer stutters at the color wheels. A color wheel built its background in the frame it scrolled into view, and four at once held up three frames; they are now prepared while SilverNode is idle.
🐛 Fixed
- VSync stays on after resizing the window or going fullscreen. Before, frames were paced by the frame limiter alone, about 70 per second on a 60 Hz display, and every sixth frame was dropped.
- Quitting right after starting no longer crashes while the file browser is still reading a large folder tree.
- The command palette’s “Search commands” hint no longer stays next to what you type.
🧹 Removed
- The
--include-jpeg start-up option: it changed a saved setting from the command line. Turn on Include JPEG files in the settings instead.
[0.9.1] - 2026-09-29
A small maintenance release.
🐛 Fixed
- Linux builds find their bundled libraries again. The packaged executable now looks next to itself for the libraries that ship with it.
- Exported JPEGs no longer carry empty text tags. Text fields without content are left out of the EXIF data instead of being written as zero-length entries, which some viewers and editors complained about.
- HiDPI screens no longer log a graphics warning at every resize.
[0.9.0] - 2026-09-23
The biggest SilverNode release yet. Make any change fearlessly: everything can now be undone and redone. Watch your colours come alive in the new vectorscope. Every action is at your fingertips, through a searchable command palette, a full menu bar, and shortcuts you make your own. And SilverNode now speaks your language — eighteen of them.
🚀 Added
- Undo and redo for everything: adjustments, ratings, AutoEdit (one batch is one step), and the rest.
- Vectorscope. Next to the histogram, plotting the colour of the rendered photo on the Oklab chroma plane, with bright colours weighing more than shadows. Either scope can be switched off, which skips its computation entirely, or pulled out to float over the photo as a transparent overlay. With enough room, the two scopes sit side by side.
- Gradient panel. Selecting a gradient brings up a floating panel with a slider for each of its adjustments, with the slider hints to match. It moves out of the way when it covers the gradient’s handles, can be dragged or pinned in place, and has a button to reset the gradient.
- Command registry. Every action is a named command with an icon, a menu home and a keybinding. One place to find them, one place to change them.
- Command palette. Open it with Ctrl-P, : or F3. Search commands by name, see the menu path they live under and the shortcut that runs them.
- Menu bar, driven by the registry. The menus are built from the same command list, so a command can never go missing from them. On macOS, the menu is handed to the system menu bar.
- Configurable keybindings. Shortcuts are read from
keymap.json. - Eighteen languages. The interface, the settings, the tips and the error messages are translated into Spanish, French, Portuguese, Italian, German, Dutch, Finnish, Swedish, Norwegian, Danish, Polish, Hungarian, Serbian, Croatian, Macedonian, Russian, Turkish and Simplified Chinese. The language can be changed from View > Language without restarting.
- Drag read-out for Blender-style bindings. While a key drag is running, a popup at the cursor names what is being adjusted and mirrors its sliders and colour wheels; in the grid, it lists the effects and the keys that drive them. Can be turned off in the settings.
- Adjustments in columns. View > Adjustments in columns flows the panel’s sections into as many columns as its width allows, instead of one long strip to scroll.
- Rate from the grid by clicking the stars on a tile.
- Export to clipboard.
- The before/after toggle now includes the crop, and fades between the two.
- Shift-arrows extend the selection in the grid; dropping several files at once selects them all.
- Hints open on F1.
- About SilverNode in the Help menu, with the version, and the people SilverNode owes a thank-you.
🔧 Changed
- A new Bayer demosaic pipeline that handles every colour filter alignment with one code path, which shrinks the binary considerably.
- The resize options on export start from sensible defaults.
- Floating panels can be dragged by their surface.
- The workspace buttons swapped places, and the grid toolbar is anchored to the right.
- Lens makers are sorted by name in the lens correction list.
- Window resizing is smooth on Wayland.
⚡ Performance
- Folders load in parallel: sidecar files are read across threads, and the file browser no longer stats for them.
- Camera and lens lookup in the lens correction database is now O(log n) instead of a linear scan.
- Far less memory is held over a long session. Memory that is no longer in use is now also handed back to the system in the background.
- JSON reading and writing moved from nlohmann::json to yyjson.
🐛 Fixed
- Every photo and edit of a previously opened folder, with their thumbnails and textures, was kept in memory for the rest of the session.
- A deadlock on Wayland between the job system and the window’s event handling.
- Lowering the denoise slider left stale denoised tiles at some zoom levels.
- The thumbnail database is opened exclusively, so a cloud-sync client such as Google Drive, OneDrive or Dropbox can no longer back up a half-written copy of it.
- A gradient’s adjustments could be dragged out of their valid range.
- Dragging and dropping a file whose name is not ASCII works on Windows.
- A crash in OpenCL denoising caused by too large a work size.
- The tiled denoise upload path used the wrong buffer shape.
- A use-after-free when changing the language.
- The 45:35 aspect ratio was not restored when reopening a photo.
- Hints were not animated when the interactive-hints setting was off.
- The UI Quality setting did not reset.
- The export queue button was not translated.
- Quitting with the group-by list open could crash.
- A click inside a submenu dismissed the menu it belonged to, and a click on a button in a floating panel started dragging the panel.
- The mouse release at the end of an adjustment drag, and events in the preview popup, reached widgets they were not meant for.
- Localized maker and model tags were loaded as duplicate lens aliases.
- Saved file browser paths are decoded correctly on load.
- Sync renders the photo before opening the file it is about to overwrite.
- Jobs that fail to produce their result now tell the consumers waiting on it.
[0.8.9] - 2026-08-10
Export learned to resize, and the grid learned to group.
🚀 Added
- Resize on export: fit, by width, by height, by shortest edge or by longest edge.
- Group photos in the grid by several criteria.
- A 45:35 crop ratio, for ID photos.
🔧 Changed
- An invalid licence now says which part of it is the problem.
- The zoom and crop logic was cleaned up considerably.
🐛 Fixed
- The slider hint for Scale-in was not updated.
- The Prepare Email dialog crashed on Windows.
- Paths that are not plain ASCII are handled correctly on Windows, throughout both SilverNode and NeonRAW.
- Crash reports write stack traces in object-mode addresses (RVA) rather than virtual addresses, so they can be symbolized.
- A combobox acting as a spinner sanitizes what it is given.
- Popups dismiss more predictably.
[0.8.8] - 2026-07-31
🚀 Added
- Crash reporting by email: on a crash or a failed assert, SilverNode prepares a mail to support with the details already filled in.
🐛 Fixed
- Auto-crop now follows the lens distortion correction, instead of leaving the bent edges in frame.
- Metal is preferred over OpenCL on macOS.
- Zoom is retriggered when the lens corrections change.
[0.8.7] - 2026-07-27
Batch editing from the grid became fast.
⚡ Performance
- Batch editing in the grid is much faster: everything it needs is saved up front, so it no longer goes back to the files for each photo.
🔧 Changed
- Moving and scaling a crop responds more finely to the mouse.
🐛 Fixed
- The contrast before/after toggle.
- A remembered copy checkbox could not be unremembered.
- Zoom behaved strangely when Z was released outside the image canvas.
- The scroll wheel consumed Shift and Alt key events that were not its own.
[0.8.6] - 2026-07-18
A release about the time between opening a folder and seeing the photos.
⚡ Performance
- Demosaicing is faster on the CPU, and there is now a performance test guarding it.
- Thumbnails load faster out of the thumbnail database.
- Directory loading is faster.
- The Halide parallel-for claims blocks of indices rather than single ones, so the threads spend their time working instead of contending.
🔧 Changed
- Startup failures are reported in a dialog instead of only in the log.
- The timings of the hints were retuned.
🐛 Fixed
- A bug in the large memory allocator where it was bypassed, caught by the tests.
- Keybindings stayed dead while the preview popup was open.
- Hints did not appear as hot.
- Events behind a popup propagated when they should not have; a popup now says what it lets through.
find_next_char_start() on UTF-8 text.
[0.8.5] - 2026-07-10
🚀 Added
- Screenshots on F12.
- Keyboard shortcuts for the pie menus.
- Ctrl-Shift-C copies all adjustments.
🔧 Changed
- The shading over the cropped-away region is brighter, so it stays visible against a dark background.
🐛 Fixed
- Pasting into a text field works, and can trim surrounding space.
- The lensfun database is listed in the acknowledgements.
- Dependencies were linked twice.
[0.8.4] - 2026-07-08
🐛 Bug Fixes
- (silvernode/licensing) Paste license works now.
- (silvernode/thumbdb) Increase maximum thumbnail size to 8MiB for really large cameras or noisy images.
- (silvernode/dwt) DWT disabling did not work.
- (silvernode/grid) No more overflowing text when filenames are long.
- (silvernode/develop) Enable wrapping on filename field.
- (silvernode/windows) DWT-disabler fixed, and turned off by default.
[0.8.3] - 2026-07-05
🚀 Features
- (neonraw/crash) Show error dialogs about a crash or failed assert.
- (neonraw/local-adjustments) Local adjustments with linear and elliptical gradients.
- (silvernode/gradients) Gradient editing with PieMenu.
- (silvernode/crash) Error dialog reporting about a crash or uncaught exception.
- (silvernode/copy) Radial menu for Ctrl-C allowing to specify what to copy.
- (silvernode/grid) Radial menu for important actions on photos.
- (silvernode/gradients) Shortcut to insert an inverted radial gradient.
- (silvernode/attention) The screen shakes to indicate the end of the sequence of photos.
- (silvernode/presets) Right-click menu to delete and rename presets.
- (silvernode/error) Error dialog when a generic error occurs.
- (silvernode/preset) Delete a preset now asks for confirmation.
- (silvernode/lens-correction) First working version of lens distortion correction, and vignetting correction.
- (silvernode/dwt) Disable “disable-touchpad-while-typing” automatically for SilverNode.
- (neonraw/lens-correction) Lens correction with distortion correction and devignetting working.
- (neonraw/bgfx) Application-wide view stats accumulator.
- (silvernode/settings) Quality levels of UI rendering.
- (neonraw/pipeline) Signal when non-realtime data is available for a full render.
- (neonraw/jrs) OptionalSingalResRef
- (neonraw/jrs) Optional products.
- (silvernode/config) Highlight the settings who are not on their default value.
- (silvernode/usage-hints) Interactive Usage Hints that help the user discover powerful features.
- (silvernode/licensing) Initial work on Licensing done.
- (silvernode/settings) UI border width (0, 1 or 2)
- (silvernode/hints) Add key-hints to the Color Balance wheels.
- (silvernode/develop) Resolution label.
- (silvernode/file-browser) Remember where you were across sessions.
- (silvernode/grid) Remove feature icons from tiles.
- (silvernode/develop) Ripple around the activated sliders for extra clarity.
- (silvernode/zoom) Press shift after zoomed to lock the zoom.
- (silvernode/hint) Zoom bindings hint.
- (silvernode/hint) Interactive hints enabled/disable checkbox in the hints popup.
- (neonraw/curves) Reset functionality.
- (nui/icon) Measure icons while tokenizing/measuring.
- (nui/curve-editor) Reset curve.
- (nui/effect) Ripple effect to grab attention without shaking.
- (nui/slider) Cancel current drag by right-clicking before releasing the drag.
- (nui/icon) New rotate-horizon icon.
- (nui/layer-depth) Determine color by depth.
- (nui/border) Support for no-border rendering.
- (nui/button/label) Update text without triggering layout.
- (nui/button) Multiline text support.
- (nui/textfield) Paste support.
- (nui/text) Support parsing and rendering icons with the default WrappedText helpers. Removed the draw_text_with_icons functionality.
- (nui/quality) Quality setting to speed up rendering and produce less geometry.
- (nui/combobox) Combobox can now have custom UI elements as options.
- (nui/dialog) Create dialog helper functions.
- (nui/pie-menu) Toggle mode and center button.
- (nui/attention) Components can ask for attention with a short animation.
- (nui/style) Containers can now have shaded backgrounds and drop shadows.
🐛 Bug Fixes
- (silvernode/exif) Fix a crash when exif data couldn’t load.
- (neonraw/curve) Bad endpoint fixed.
- (silvernode/develop) Implement new contrast curve as the monitor function of the curve editor.
- (neonraw/curve) Curve value computation optimization was disabled.
- (silvernode/lens-correction) Maximum valid radius computed for Full-Frame lenses being calibrated on an APS-C sensor.
- (neonraw/texture) Memory regions for mipmaps were incorrectly validated upon freeing.
- (neonraw/memory-leak) Fix a GPU memory leak where the photo Texture data was never freed.
- (silvernode/denoiser) Lowest noise level of denoiser is now lower.
- (silvernode/grid) Layout error causing undefined behavior and all tiles being on one line.
- (silvernode/develop) Fix glitchy white balance.
- (silvernode/denoiser) Rerender when denoiser is ready.
- (silvernode/preset) Hovering presets fast did not render the last hovered preset.
- (neonraw/jrs) Work on GPU jobs while waiting for jobs to complete on JobSystem shutdown.
- (neonraw/small_vector) Implemented move assignment operator and move constructor.
- (silvernode/macos) Prevent the window from bypassing the compositor and loose OS-provided color calibration in fullscreen mode.
- (silvernode/bindings) Fix RFV TGB double use when they also represent RGB.
- (silvernode/bindings) Fix some broken bindings.
- (silvernode/grid) Fix double rendering of background of a tile.
- (nui/utf8) Fix character counting bug.
- (nui/container) Fix the rendering of the subtle border of the containers.
- (nui/error) Restore border for active and error components.
- (nui/layout) Fix layout bug with collapses in the grid.
- (nui/animator) Remove animator if component is destroyed.
- (nui/icons) Icon parsing bug fixed.
- (nui/file-browser) Implement min-width algorithm.
- (nui/scroller) Layout bug through scrollers.
- (nui/viewport) Visible area was not passed down through containers.
- (nui/layout) Implement correct rounding to container and child sizes.
- (nui/button) Icons as UTF8 codepoints are now rendered.
- (nui/layout) Min/max size not respected when child was preferring a size outside of that range.
🚜 Refactor
- (nui/font-size) 4 font size slots instead of a floating point factor, and font sizes per widget type.
📈 Improvements
- (silvernode/gradient) Linear gradient draws an arrow to the effect side of the gradient.
- (silvernode/frame-pacing) Fixed some sources of frame pacing issues.
- (neonraw/jrs) Skip waking up the GPU thread, if the current job is executed on the GPU.
- (neonraw/upload) Uploading texture data is no longer unnecessarily copied to a temporary allocation.
- (neonraw/align) Faster pointer alignment procedure.
- (neonraw/crash) Minimize stacktrace in error dialog.
- (neonraw/jrs) Make acquire and new_instance() fully lock-free.
- (neonraw/logging) More loggers.
- (neonraw/logging) Cleanup debug logging.
- (neonraw/raw) Store RAW data as with 16 bit color depth (takes more GPU memory).
- (neonraw/render) Rendering requires lower LOD, and a touch of fake sharpening is added in the shader.
- (silvernode/crash) Prevent recursive crashing when GPU is OoM: only attempt once to report through SDL_ShowMessageBox.
- (silvernode/grid) Only update visible tiles when doing batch edits.
- (silvernode/error) Error message when failing to save edit.
- (silvernode/denoiser) Use new OptionalSignalResRef.
- (silvernode/text) Use nbsp in a few places.
- (silvernode/hints) Show info in Masonry when there are no tiles.
- (silvernode/ui) UI style improvements.
- (silvernode/adjustments-panel) Improve UI.
- (neonraw/halide) Be more verbose during GPU API selection.
- (neonraw/halide) Increase block size for interleave_insert_alpha for CPU.
- (silvernode/hint) Shadow behind animated hint icon.
- (nui/grid) Expose Collapses to be able to pass them directly into nui::make_grid().
- (nui/toggle-button) Make colors on non-selected toggle buttons clearer neutral.
- (nui/scroller) No animation on scroll_to_make_visible if already visible.
- (nui/file-browser) Move the action-button into the viewport when sitting inside a scroller.
- (nui/layers) 5 generic layers.
- (nui/popup) Popup gravity and anchoring is made consistent and has a neat helper function to set to the mouse position.
- (nui/checkbox) Checkbox design improved.
⚡ Performance
- (nui/stroker) Less bevel and round, and more miter line joins.
🎨 Styling
- (silvernode/key) Shift key now uses the up-arrow icon when a space-efficient symbol is needed, and “up-arrow Shift” when there is more space.
- (silvernode/toolbar) Make the buttons look like a neat group.
[0.8.2] - 2026-05-03
🐛 Bug Fixes
- (neonraw/macos) Crash on startup, due to LMA not aligning to 16KiB page size.
- (silvernode/reset) Fix a crash upon resetting the edit of a picture.
- (silvernode/preset) Bugfix where thumbnails would flicker while the AI was working.
- (nui/file-browser) Std::filesystem::relative may throw.
📈 Improvements
- (neonraw/effects) Better saturation effect.
- (neonraw/effects) Better contrast effect.
- (neonraw/lma) Late init the LMA.
- (silvernode/crash-handler) Also report upon uncaught C++ exceptions.
[0.8.1] - 2026-04-26
🚀 Features
- (silvernode/develop) Click the star ratings to adjust the rating.
- (nui/rating) Set cursor when a callback is set.
🐛 Bug Fixes
- (neonraw/bgfx) Flush frame.
- (silvernode/develop) Fix a flicker to black when submitting edits.
- (neonraw/jrs) Several concurrency bugs have been fixed.
- (neonraw/jrs) Fix unresponsiveness upon low worker count.
- (silvernode/photo) JRS semaphore is now unique per photo. This fixes several stalls.
- (silvernode/auto-edit) AutoEdited white level is now saved.
- (silvernode/crash) Fixed the VRAM memory leak and glitches when texture slots were depleted.
- (neonraw/jrs) Fix deadlock where all threads are waiting on all other threads.
- (silvernode/photo) Prevent loading of the picture that is just being replaced in the Develop module.
- (silvernode/develop) Develop became unresponsive when the number of preloaded photos is higher than the worker count.
- (neonraw/jrs) Check for new jobs to launch when semaphore reaches 0.
📈 Improvements
- (neonraw/jrs) Remove indirection unpacking from the JRS.
- (neonraw/jrs) Optimized Halide parallel for routine.
- (neonraw/memory) Large memory allocator to recycle 2+ MB allocations.
- (nui/button) Center the icon if there is no text.
⚡ Performance
- (neonraw/halide) Improve CPU performance of certain pipelines.
[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 Resultas [[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-04
🚀 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, 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-17
🚀 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.
[0.1.0] - 2025-06-02
The first tagged build of SilverNode: a RAW editor written from scratch, with its own processing pipeline, its own widget toolkit and its own EXIF reader.