December 21, 2025

Source: https://github.com/darktable-org/darktable/releases/tag/release-5.4.0

We’re proud to announce the new feature release of darktable, 5.4.0!

The github release is here: https://github.com/darktable-org/darktable/releases/tag/release-5.4.0.

To build from source, do not use the autogenerated tarball provided by GitHub on the release page, download our tar.xz file instead. If you’re just building for yourself without creating a package for some distribution, then using source code cloning in git is an even more convenient way.

When updating from the stable 5.2 series, please bear in mind that your edits will be preserved during this process, but the new library and configuration will no longer be usable with 5.2.

You are strongly advised to take a backup first.

Important note: to make sure that darktable can keep on supporting the raw file format for your camera, please read this post on how/what raw samples you can contribute to ensure that we have the full raw sample set for your camera under CC0 license!

Since darktable 5.2:

  • 996 commits to darktable+rawspeed
  • 386 pull requests handled
  • 56 issues closed

Please note that the darktable documentation is not currently complete for release 5.4
and contributions are greatly appreciated. Please see the
project documentation
for more information on how to contribute.

The Big Ones

The following is a summary of the main features added to darktable
5.4. Please see the user manual for more details of the individual
changes (where available).

  • A new section Capture Sharpening is added into the demosaic
    module. The capture sharpening tries to recover details lost due to
    in-camera blurring, which can be caused by diffraction, the
    anti-aliasing filter or other sources of Gaussian-type blur.
  • Added a new tone mapper implementation based on Blender’s AgX
    display transform. The new module’s color output is similar to that
    of Sigmoid, but the provided set of controls is more extensive. It
    allows for setting exposure white and black points explicitly,
    similar to Filmic RGB. The implementation includes a user-adjustable
    pivot point for the tone curve, with the default set at 18%
    mid-gray. Contrast around this pivot is adjustable. Controls are
    provided to create a section of constant contrast, and independent
    sliders are available to control the contrast in shadows and
    highlights (the “toe” and “shoulder” of the curve). The resulting
    output is characterized by a gradual color desaturation in
    highlights, similar to film, and a natural-looking color
    representation in mid-tones and highlights.
  • Added support for multiple workspace. When the corresponding option
    is activated on the preferences, Darktable opens a dialog when
    starting. From this dialog one can select the default workspace (the
    one created the first time and currently used by everyone by
    default) or to create a new one. Each workspace has it’s own
    database and configuration file (collection, last UI defaults…).An in memory workspace can also be selected in the dialog. In this
    case there is no database created in disk, a configuration file is
    created though.

UI/UX Improvements

  • Many GNU/Linux distributions have dropped support for X11 leaving
    only Wayland. Darktable has received many fixes to work properly on
    Wayland including display ICC profiles. This version 5.4 should work
    on Wayland as good as it was on X11.
  • Show a busy cursor when changing views. This provides immediate
    feedback when, for example, double-clicking an image in the
    lighttable instead of simply freezing the UI until the darkroom has
    finished opening.
  • Added the standard “Window” menu to the application menu bar on
    macOS.
  • In Tone Equalizer module move controls for mask exposure and
    contrast compensation to the advanced tab.
  • In the navigation windows, the zoom dropdown is now better behaving. After a
    free zoom over the darkroom, using the scroll over the zoom level
    indicator of the navigation window, the selected zoom will be the
    closest match (above or below depending on the scroll
    direction). This is better than previous behavior where the zoom level
    was always set to “small”.
  • When moving around in a (zoomed) center view in the darkroom, we now
    pre-calculate a slightly larger area so that it might not always be
    necessary to immediately recalculate after further moves. The
    initial 1px mouse move is generally not final, after all. This does
    mean longer calculation times, so you can switch this off by setting
    darkroom/ui/anticipate_move in darktablerc to 1.0. If you use cursor
    keys to move around, you might want to increase it to >1.4 to
    anticipate at least one further 20% move on either side. When the
    recalculation is triggered by a module parameter change, say
    exposure increase, only the exact area shown is calculated as
    before, for optimal responsiveness.
  • When applying a rotation or flip, the transformation will be immediately
    applied to the part of the image currently shown in the center view while
    waiting for a full recalc. It used to be only repositioned but not rotated
    which would lead to weird overlays for a brief period.
  • The popup (that you get when right-clicking) for sliders with a 360°
    range now shows a color wheel or compass. If the slider is
    soft-limited to a smaller range (for example in rotate&perspective)
    you can toggle zooming out to the full range by
    middle-clicking. Another middle click will restore the soft range
    (and the normal fine-tuning mechanism).
  • When the slider range has been zoomed out beyond soft limits, the
    now visible “extreme” areas have a slightly different color.
  • To make the rotation in the wheel match the rotation effect in the
    image, most slider directions for angles have been reversed. You may
    want to add a “-1” speed to any shortcuts you have gotten used to.
  • Added new default shortcut keys. These will take effect only if the
    keys do not yet have user-defined assignments.
    • c – toggle crop box.
    • e – set exposure compensation (equivalent to
      right-clicking on the exposure slider).
    • alt-r – set image rotation (equivalent to
      right-clicking on the rotation slider).
    • alt-[ and alt- ] – fine rotation adjustment.
  • Different shapes for the indicator on sliders can now be selected in
    preferences/misc/interface (triangle, circle, diamond, bar).
  • All toolbar buttons on the lighttable and darkroom have their
    enabled state recovered across sessions. The visibility of the
    enabled buttons has been improved to avoid confusions when
    restarting Darktable and seeing artifacts due to some tools being
    activate like Gamut check.
  • Make the cursor indicating the selected thumbs more visible. It is
    now bigger and has a border to ensure better visibility on dark
    thumbs.

Performance Improvements

  • Tune performance for the Lut3D module (5% to 20% speed-up).
  • Dramatically speed up first startup of a new installation when the
    library is stored on a hard drive or NAS rather than SSD.
  • When zooming or panning the center view, transformations in the liquify
    module are ignored. This leads to much improved responsiveness when
    that module is active.

Other Changes

  • Allow using Shift modifier to select only the feather
    points on blend masks. This is sometime needed when the path point
    and the feather point are too close to each others.
  • Hierarchical presets are now supported for utility modules as well
    as processing modules.
  • Dual demosaicing now works also in tiling mode for possibly better
    OpenCL performance and smaller CPU memory pressure.
  • Added automatic compensation of camera’s hidden underexposure for
    Canon Lighting Optimizer mode, Nikon Active D-Lighting and HLG tone
    modes, Olympus Gradation mode, Pentax Dynamic Range Expansion mode,
    and Fujifilm DR200/DR400 modes. This affects both the “exposure” and
    “denoise (profiled)” modules.
  • Add a RGB percent display in the color picker module.
  • Allow far smaller crop area to be created (crop up to 99% of the
    image size).
  • Allow the variable $(ROLL.NAME) to have optional levels,
    $(ROLL.NAME[n]), where 1 <= n <= 5, the levels follow the same
    rules as film roll, the default value n=1, this keep the previous
    behavior of $(ROLL.NAME).
  • Added optional collection of shortcut assignments using
    keyboard+mouse combinations to control image processing
    modules. Install these by clicking on the new “import extras” button
    on the Shortcuts tab under Preferences.
  • Remove the “overwrite” option from the lighttable history stack
    module. This option is used when pasting history to delete the
    current history stack before pasting the new one. It is rarely used
    and was confusing people when working copying/pasting on darkroom
    from the filmstrip as this option was only visible on
    lighttable. The option has been moved into the paste parts dialog.
  • Added manual chroma subsampling control for AVIF export. Users can now
    choose between auto, 4:4:4, 4:2:2, and 4:2:0 chroma subsampling modes
    independently of the quality setting, allowing better optimization of the
    quality-vs-size tradeoff for AVIF files.
  • The processing modules/<focused> shortcuts also work if the quick
    access panel is “focused”, addressing the first 20 sliders or
    dropdowns.
  • If only the first rotor on a midi controller is assigned, the higher
    numbered ones automatically address increasing elements of the same
    action or subsequent actions. This allows quick (re) assignment to
    the <focused> action or to the mimics set up with for example the
    x-touch Lua script.
  • Added the ability to calculate crop factor for Olympus cameras.
  • When creating styles with multiple images selected, clicking Cancel
    button or typing ESC on the style dialog now ends the
    whole process instead of continuing with the next image.

Bug Fixes

  • Fixed some issues with the hierarchical styles handling in the
    styles module.
  • Fixed moving additional extra audio or text sidecar files when
    an image is moved.
  • Fixed module based collection restoring. After quitting darktable with a
    module based collection, the lighttable was empty after restarting it.
  • Fixed some reset issues of the export module. The format and storage
    sections were not reset properly.
  • Fixed corruption of sidecars during large imports of images with XMP
    sidecars.
  • Fixed a bug where changing the image scaling in the export module
    influences the result of a running export job.
  • Make sure we always fill the complete main darkroom canvas while
    zooming at large scales.
  • When zoomed to 1600% don’t ignore sub-pixel panning/dragging, which
    made it almost impossible to move around at all.
  • Make sure image changed_timestamp is updated when a sidecar file
    is applied.
  • Fixed drag and drop of images on the map gives wrong location
    assignment on macOS.
  • Fixed auto applied presets for sraws and true monochromes.
  • Fixed a bug in details threshold mask for monochrome raw files
    leading to crashes.
  • Fixed an issue when positioning the main darkroom windows due to
    precision in computation. The precision is now to the pixel and
    avoid a displacement in some cases.
  • Fixed issue in darktable-cli that prevented input files from being
    detected.
  • Fixed out of memory issue which could kill Darktable on small
    systems when processing large images.
  • Fixed toast message translation displayed when scrolling over the
    module’s preset buttons.
  • Fixed issue in darktable-cli that prevented input files from being
    detected.
  • Fixed an issue with reading TIFF files that (incorrectly) contain
    metadata specific to the raw files they were made from.
  • Fixed an issue where imported styles that didn’t have a name could
    cause darktable to crash when starting.
  • Fixed a bug leading to wrong colors in main darkroom window (mostly
    after using a module picker) due to bad color coeffs in colorin
    module.
  • Fix support for Wayland. The UI is now working as expected and
    Darktable will handle ICC profile from colord.
  • Fixed processing module naming based on the presets when the used
    preset is renamed or deleted.
  • Fixed a bug in darktable-cli where exporting a duplicate version of
    an image would use the tags attached to the base version instead of
    the tags attached to it.
  • Fixed a bug in darktable-cli where synonyms for tags attached to an
    image were ignored when exporting it.
  • Fixed auto-applied user’s presets when Ctrl+click on a
    processing module after restarting Dartkable.
  • Fixed a bug where adding an image to a group in lighttable could
    merge multiple group together.
  • Fixed a print issue which is probably happening only on macOS. When
    printing in landscape mode, the rotation of the picture is not done
    on the printer. So only a part of the image is printed at the bottom
    of the page. This issue is not fully understood at this stage and
    has only been reported twice. If you encounter this issue then you
    can set the following variable in your darktablerc to force the
    landscape CUPS option to be generated:plugins/print/cups/force_landscape=TRUE
  • Fixed possible display of double thumbs cursor on filmstrip when in
    darkroom. Also the thumbs background could look as selected on
    multiple pictures.
  • Fixed darkroom processing after changing any of the colour profiles.
  • For module toggle shortcuts (like enable, show and focus) the “on” and
    “off” effects are now respected (they dont simply always toggle
    anymore, like they did before).
  • Fix too strict restriction for filename length in watermark module.

Lua

API Version

  • API version is now 9.6.0

New Features

  • Added darktable.query_event() to check if an event is registered.
  • Added collection-changed event that fires when the collection changes.
  • Added darktable.configuration.share_dir and darktable.configuration.data_dir
    to expose the darktable data and share directories.

Bug Fixes

  • Check added to ensure view has changed before processing GUI events
    preventing hang on start.
  • return a nil value instead of throwing a Lua error if the indexed element of
    the following Lua tables does not exist or if the table is empty:
    • dt_lua_tag_t.#
    • dt_lua_film_t.#
    • dt_style_t.#
    • darktable.films.#
    • darktable.styles.#
    • darktable.database.#
    • darktable.collection.#
  • Ensure darktable.database.get_image() returns a nil, in all conditions,
    for an image that doesn’t exist.
  • Ensure translations are displayed in UTF-8 under Windows