Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
753 commits
Select commit Hold shift + click to select a range
189fb5b
gtk4-prep: fix hold shortcut delayed-release handling
Arecsu Aug 7, 2026
edead19
gtk4-prep: fix collection treeview press claiming and activation
Arecsu Aug 7, 2026
d2aaec7
gtk4-prep: fix sticky hover state on buttons after menus and dialogs …
Arecsu Aug 7, 2026
2d57b70
gtk4-prep: keep mouse_inside across shortcut grab crossings
Arecsu Aug 8, 2026
c642c5f
Safer cl_mem alloc&test via clEnqueueMigrateMemObjects
jenshannoschwalm Aug 5, 2026
214e2ba
Change the translation of the term light table
victoryforce Aug 7, 2026
4be77e5
Consistently fix casing of the translation of the term darkroom
victoryforce Aug 7, 2026
b1c0d98
21758: check for active picker before exposure/colour matching adjust…
kofa73 Aug 8, 2026
7cbfaff
We shouldn't instruct the user to make shallow clones
victoryforce Aug 8, 2026
ee28cf2
fix build for newer cmocka versions
piratenpanda Aug 8, 2026
26b322e
Add new module contrastntexture
jandren Aug 8, 2026
f72b970
modulegroups: Add back bilat in all modules group.
TurboGit Aug 8, 2026
76b3d7d
some bauhaus cleanup
dterrahe Nov 22, 2024
c31c1c0
Fix more dt_gui_get_font() use cases
jenshannoschwalm May 23, 2026
9f8850b
gtk4-prep: gate touchpad panning on the source device via dt_gui_scro…
Arecsu Aug 8, 2026
ada63f2
gtk4-prep: make ctrl+scroll zoom direction consistent across views
Arecsu Aug 8, 2026
2e97e57
gtk4-prep: fix scroll/event cleanup leaks and NULL derefs
Arecsu Aug 8, 2026
228c81c
gtk4-prep: make horizontal scroll-zoom direction shift-aware via a sh…
Arecsu Aug 8, 2026
ee781d3
gtk4-prep: use the shared scroll-zoom direction helper in the navigat…
Arecsu Aug 8, 2026
24db15a
add release note for image dimension collection filter
zisoft Aug 9, 2026
8c00022
constratntexture: Remove trailing spaces.
TurboGit Aug 9, 2026
de7ff89
contrastntexture: Fix a string.
TurboGit Aug 9, 2026
a87a8b0
Update darktable.pot for translators.
TurboGit Aug 9, 2026
1e03856
Update French translation.
TurboGit Aug 9, 2026
17a6b0c
Wrap readPixels calls in a try/catch block
victoryforce Aug 8, 2026
13886e7
Drop unneeded includes
victoryforce Aug 8, 2026
2ff63f1
Improvements for pixelpipe cache
jenshannoschwalm Aug 9, 2026
cacad7c
Add Instagram's landscape aspect-ratio to crop
frivoal Jul 21, 2026
64a9a68
Drop commercial name
frivoal Jul 29, 2026
7c187a5
Remove sizing info that looks like a pixel size
frivoal Aug 7, 2026
39a1425
fix display of internal tags after import
zisoft Aug 9, 2026
3f571a7
gtk4-prep: restore right-click node popup and alt+scroll channel tab …
Arecsu Aug 9, 2026
13c6189
modulegroups: restore the all modules view
Arecsu Aug 9, 2026
048ff17
gtk4-prep: exclusive display mode selection in the modulegroups activ…
Arecsu Aug 9, 2026
c3c1623
modulegroups: restore the group selection without firing the toggle h…
Arecsu Aug 9, 2026
afc7a8e
modulegroups: apply visibility updates synchronously on the gui thread
Arecsu Aug 9, 2026
16cdab0
dtgtk/expander: don't animate the initial expanded state
Arecsu Aug 9, 2026
bf3d6fc
en@truecase update
victoryforce Aug 9, 2026
9f3d4ec
Ukrainian translation update
victoryforce Aug 9, 2026
a130900
segmentation: fix mask upsampling to pixel-centre convention
hexadecimil Aug 6, 2026
441da61
gtk4-prep: release the shortcut grab before running the action
Arecsu Aug 9, 2026
f61aa6b
gtk4-prep: stop opening the preset menu on module body right-click
Arecsu Aug 9, 2026
187d4e2
gtk4-prep: restore motion events to widgets with motion controllers
Arecsu Aug 9, 2026
1997669
fix: refresh lighttable layout buttons when leaving full preview
Arecsu Aug 9, 2026
3bdfcc5
Refine data shutdown UI responsiveness
jenshannoschwalm Aug 10, 2026
2eb5227
Fix use-after-free when a preference is not available
da-phil Aug 10, 2026
bc5398f
Fix segmentation preprocessing to pixel-centre sampling
andriiryzhkov Aug 10, 2026
26b5e88
Fix blending visualizing masks
jenshannoschwalm Aug 10, 2026
432f802
Use g_try_realloc instead of g_realloc to prevent OOM crashing
victoryforce Aug 11, 2026
1d3243e
Delete goto as dead code (JXL_FAIL macro already performs 'goto end')
victoryforce Aug 11, 2026
b25879d
More checks for OpenCL allocations
jenshannoschwalm Aug 11, 2026
3465660
Remove unused <assert.h> from source files
victoryforce Aug 10, 2026
8cd739f
gtk4-prep: fix crash selecting the "from image area" white balance pr…
Arecsu Aug 11, 2026
ce5089d
gtk4-prep: fix "copy to active picker" from saved colorpicker samples
Arecsu Aug 11, 2026
b8fe189
Some fixes and a workaround for freeze on 'compress history stack'
kofa73 Aug 13, 2026
659a66b
Don't dt_dev_zoom_move() if mask mode didn't change
jenshannoschwalm Aug 13, 2026
0780f0b
Safer dt_get_available_pipe_mem()
jenshannoschwalm Aug 12, 2026
89ea3cd
Account for and disable distorted mask caches on low-mem systems
masterpiga Aug 13, 2026
239e56e
allow markup in mask manager treeview
zisoft Aug 13, 2026
88c7b6c
fix import progress count message
zisoft Aug 13, 2026
7c5a207
Update es.po for 5.6.x
EdgarLux Aug 13, 2026
8e25558
fix: mouse wheel responds on the first tick after a direction change
Arecsu Aug 11, 2026
bcf99a2
fix: don't attenuate wheel notch deltas in the discrete scroll proxy
Arecsu Aug 11, 2026
7b6b3bf
gtk: simplify scroll attenuation conditional per review
Arecsu Aug 13, 2026
812bd7d
Add darktable-mcp server exposing the raw engine to AI agents
andriiryzhkov Jul 19, 2026
548ed59
tests: fix test_ai_backend link failure
da-phil Aug 8, 2026
6078470
ci: actually run the unit tests
da-phil Aug 8, 2026
3b2445c
Update darktable.pot for translators.
TurboGit Aug 14, 2026
3f504e0
Update French translation.
TurboGit Aug 14, 2026
458a8af
en@truecase update
victoryforce Aug 14, 2026
7d64b8c
Ukrainian translation update
victoryforce Aug 14, 2026
b3a08b7
gtk4-prep: add dt_gui_connect_click_secondary and use it for right-cl…
Arecsu Aug 9, 2026
8ed7633
gtk4-prep: migrate dialog enter handling to key controllers
Arecsu Aug 9, 2026
615d105
gtk4-prep: convert simple button/motion/key handlers to controllers
Arecsu Aug 9, 2026
6126ce1
gtk4-prep: notebook input and bauhaus popup motion to controllers
Arecsu Aug 9, 2026
b275848
gtk4-prep: convert preset and style menu item handling to gestures
Arecsu Aug 9, 2026
e1e9cad
gtk4-prep: remove synthetic event paths from shortcuts and menus
Arecsu Aug 9, 2026
4a4f3ed
gtk4-prep: gradientslider input via event controllers
Arecsu Aug 9, 2026
978e4b5
gtk4-prep: lighttable center viewport and pinch to controllers
Arecsu Aug 9, 2026
7e1bae3
gtk4-prep: panel-scroll gating and resize-wrap on controllers
Arecsu Aug 9, 2026
9d5be15
gtk4-prep: read controller/gesture events instead of gtk_get_current_…
Arecsu Aug 9, 2026
40fead6
gtk4-prep: guard the GTK3-owned event free in the thumbtable filemana…
Arecsu Aug 10, 2026
fe967ce
gtk4-prep: share the touchpad pinch GtkGestureZoom bridge
Arecsu Aug 10, 2026
6c205bd
gtk4-prep: share and guard the alt+scroll channel-tab forwarding
Arecsu Aug 10, 2026
7255b2b
fix: connect the non-expandable lib presets 'clicked' handler only once
Arecsu Aug 10, 2026
db2a80a
libs: resolve the non-expandable presets button FIXME and wire it once
Arecsu Aug 10, 2026
59814bb
gtk4-prep: route the last alt+scroll forwarders through dt_gui_forwar…
Arecsu Aug 10, 2026
ac610ee
gtk4-prep: share the preset popup menu builder between libs and iops
Arecsu Aug 10, 2026
e540fd7
dtgtk: add the button+tooltip+action+click factory and convert call s…
Arecsu Aug 10, 2026
cbc069a
modulegroups: share the popup menu creation and anchoring
Arecsu Aug 10, 2026
f5aa0e0
dtgtk: pass the button factory extras as a named config struct
Arecsu Aug 10, 2026
aabd376
dtgtk: convert the last factory-shaped button sites
Arecsu Aug 10, 2026
618b513
dtgtk: support tooltip markup in the button factory
Arecsu Aug 10, 2026
e20396e
dtgtk: togglebutton factory and convert the wiring cluster
Arecsu Aug 10, 2026
6d66d84
fix: preset popup menu leaves a bare separator for writeprotect presets
Arecsu Aug 10, 2026
2bc7be1
gtk4-prep: fix review findings from the event-controller sweep
Arecsu Aug 10, 2026
6a3a59d
gtk4-prep: fix stale _color_picker_widget_toggle call after rename
Arecsu Aug 13, 2026
50512f2
Remove the mistakenly duplicated code line
victoryforce Aug 13, 2026
eb79082
fix: don't treat a relayed gesture cancel as a click in thumbtable/cu…
Arecsu Aug 13, 2026
d56cfb5
Minor code simplification.
TurboGit Aug 14, 2026
3a31620
fix: activate module actions even when the module was never expanded
Arecsu Aug 14, 2026
00f7014
fix presets auto applying
piratenpanda Aug 14, 2026
544cc2a
zoomable lighttable: keep rejected/greyed thumbnails in sync on widge…
Arecsu Aug 14, 2026
2bfec4b
Update de.po
MStraeten Aug 14, 2026
d5e19d3
fix: touchpad pan and pinch in zoomable lighttable
Arecsu Aug 13, 2026
98a18f7
fix: persist zoomable lighttable pan position during move
Arecsu Aug 13, 2026
bfb4a45
zoomable lighttable: continuous pinch/scroll zoom, combined pan, and …
Arecsu Aug 14, 2026
bf48a9c
Fix calculations for fast opencl tiling
jenshannoschwalm Aug 14, 2026
c7fcc00
Let's remove some superfluous log messages
jenshannoschwalm Aug 14, 2026
7fcbb3e
Some OpenCL maintenance
jenshannoschwalm Aug 15, 2026
2989f3d
always show the duplicate history button in duplicate manager
zisoft Aug 15, 2026
3a3a236
ci: untap aws/tap on macOS runners
da-phil Aug 15, 2026
d6615e1
Translate task names in AI preferences
andriiryzhkov Aug 15, 2026
2c15a64
Update French translation
TurboGit Aug 15, 2026
dcaa5fe
Update French translation
TurboGit Aug 15, 2026
4223541
Free local_laplacian kernels when exiting OpenCL
jenshannoschwalm Aug 16, 2026
df96e15
Provide --opencl-no-tiling
jenshannoschwalm Aug 16, 2026
f018892
Improved importance cache hint
jenshannoschwalm Aug 16, 2026
a3b8491
Improved analysis of NaN pipe data
jenshannoschwalm Aug 16, 2026
84cbbb8
fix signal callback description for DT_SIGNAL_DEVELOP_HISTORY_WILL_CH…
zisoft Aug 15, 2026
a1a202c
iop_profile: replace the buffer instead of converting it in place
piratenpanda Aug 16, 2026
a19c005
lut3d: don't pass one image as both source and target on the GPU
piratenpanda Aug 16, 2026
8e35284
atrous: don't pass one image as both source and target on the GPU
piratenpanda Aug 16, 2026
5daa402
bauhaus: fix scroll step calculation for large-range sliders
kadykov Aug 15, 2026
f229ef5
Update RELEASE_NOTES.md
piratenpanda Aug 16, 2026
8a7f888
RELEASE_NOTES.md: Remove an entry already in 5.6.x
TurboGit Aug 16, 2026
1719731
Revert "RELEASE_NOTES.md: Remove an entry already in 5.6.x"
TurboGit Aug 16, 2026
ab22db0
Fix incorrect NAN detection
victoryforce Aug 16, 2026
2483a34
cmake: link libwayland-client when GTK3 has the Wayland backend
da-phil Aug 15, 2026
741eb07
Fix unit test link error in Debug builds
da-phil Aug 15, 2026
0fd218f
Updates to pt_BR
jpellegrini Aug 17, 2026
444cd59
Update RELEASE_NOTES.md
piratenpanda Aug 16, 2026
7bd42e6
fix-21811: fix fallback paths in case of failed solve
kofa73 Aug 15, 2026
e5dd180
fix-21811: fix delayed warning message in case of failed solve
kofa73 Aug 16, 2026
16e131b
fix-21811: update choleski.h's summation to double precision
kofa73 Aug 15, 2026
513d87f
exif: fix O(n^2) XMP tag removal on write-out
masterpiga Aug 17, 2026
48949a5
Add WB presets for Sony ZV-E1
rtmongold Aug 17, 2026
a947b01
Add Sony ZV-E1 noise profile
rtmongold Aug 17, 2026
0ae2458
history: include masks_history in the edit-history hash
masterpiga Aug 17, 2026
a56fef1
Add Canon EOS R6 Mark III noise profile
rtmongold Aug 18, 2026
e138a65
Lua: use natural preference row heights
radialmonster Aug 19, 2026
7182b63
Fix raw denoise picker offset after cropping
andriiryzhkov Aug 18, 2026
8837fac
Add auto-alignment for HDR bracket merging
da-phil Jun 25, 2026
8cd829e
Only show HDR alignment options when OpenCV is used
da-phil Aug 10, 2026
35e214e
Clean-up python prototype references in docs and code
da-phil Aug 13, 2026
dd14bf1
Remove superfluous C glue code and directly use C++ functions
da-phil Aug 14, 2026
5ce6eca
Add OpenCV status to darktable --version output
da-phil Aug 15, 2026
1a55fb1
Clean-up and format C++ code
da-phil Aug 15, 2026
f7e5dc5
Install AI models from additional repositories
andriiryzhkov Aug 13, 2026
ca01469
Identify the source of manually installed models
andriiryzhkov Aug 14, 2026
07503b0
Update darktable.pot for translators.
TurboGit Aug 19, 2026
287cf0d
Update French translation.
TurboGit Aug 19, 2026
15dc526
Introduce generic theme variants.
TurboGit Jun 27, 2026
197ccca
Fix typo in French translation.
TurboGit Aug 19, 2026
1e1f913
Remove unused includes and directly include what we use
victoryforce Aug 12, 2026
84e3aa3
en@truecase update
victoryforce Aug 19, 2026
519e467
Ukrainian translation update
victoryforce Aug 19, 2026
7e1c69e
bauhaus: fix broken dragging in the popup's precise-entry mode on GTK3
masterpiga Aug 17, 2026
b6c27cb
Protection against dereferencing NULL that dt_bilateral_init can return
victoryforce Aug 11, 2026
ea0609e
Make functions NULL-safe
victoryforce Aug 12, 2026
41fc0d2
update de.po
MStraeten Aug 19, 2026
d792a31
Add support for lo (Lao)
victoryforce Aug 20, 2026
70701f6
Update TRANSLATORS.md
anoderay Aug 20, 2026
50291ad
Fix workspace selection not remembered at startup
andriiryzhkov Aug 20, 2026
f0d74a2
Fix corruption of bottom-right pixel of each 2x2 block
victoryforce Aug 20, 2026
41b9d42
gui: restore tooltips after runtime toggle
Arecsu Aug 19, 2026
b9e9963
map: restore scroll and drag interactions
Arecsu Aug 19, 2026
8ac01de
modulegroups: prevent recursive QAP rebuild
Arecsu Aug 19, 2026
0637ad9
develop: quiesce pixelpipes before IOP GUI teardown
Arecsu Aug 20, 2026
646de80
develop: keep workers out of mask overlay GUI data
Arecsu Aug 20, 2026
0a536de
gui: defer view teardown and reject stale signals
Arecsu Aug 20, 2026
dcd1c4a
gui: centralize cursor ownership and cleanup
Arecsu Aug 20, 2026
e206312
gui: pass panel widget to resize motion controller
Arecsu Aug 20, 2026
baeb5fe
exif: fix O(n^2) XMP history write in _set_xmp_dt_history
masterpiga Aug 20, 2026
dee4dd6
Fix neural denoise/upscale grouping logic when input image is not the…
jeffc Aug 20, 2026
8635e5a
Add VS Code Dev Container Configuration (#19597)
kadykov Aug 20, 2026
27a8c0b
history: keep the active entry selected on re-click
Arecsu Aug 20, 2026
4884852
Update de.po
MStraeten Aug 21, 2026
cda39cb
IOP Color EQ : Add interactive editing mode for color adjustments in …
Christian-Bouhon Aug 22, 2026
e58f730
lighttable: clamp stale thumbnail offsets
Arecsu Aug 22, 2026
19abd36
presets: refresh pixelpipes after GUI synchronization
Arecsu Aug 22, 2026
f8e8045
control/crawler: examine sidecar files in parallel and in the background
hennikul Aug 15, 2026
a1142f9
control/crawler: wait for the film roll being opened
hennikul Aug 15, 2026
2268c32
control/crawler: examine a directory at a time instead of probing per…
hennikul Aug 15, 2026
1862057
gtk4-prep: preserve history end during darkroom setup (#21948)
Arecsu Aug 22, 2026
cf69831
Updates to pt_BR
jpellegrini Aug 22, 2026
2e3994d
gtk4-prep: keep mouse wheels out of touchpad pan routing on gui (#21945)
Arecsu Aug 22, 2026
0211316
packaging/windows: always show the install-location page (#21936)
anoderay Aug 22, 2026
f53c19e
macos: restore semantic Command text editing
Arecsu Aug 22, 2026
8ead4ee
macos: route Command editing through shortcut dispatcher
masterpiga Aug 22, 2026
eb58ea9
integration: Update sub-module, new contrast & texture test.
TurboGit Aug 23, 2026
97ead64
Update ja.po (#21966)
shinoryo1216 Aug 23, 2026
bb755be
Skip auto-applied denoise presets on AI denoised output
andriiryzhkov Aug 23, 2026
09d1514
Fix compilation on GCC 16.x.
TurboGit Aug 22, 2026
276fd41
Add preference to disable automatic AI model update checks
andriiryzhkov Aug 19, 2026
297890a
masks: fix path/brush shape and node drag snapping on release
masterpiga Aug 24, 2026
22b5f95
Updates to pt_BR
jpellegrini Aug 24, 2026
411acb4
Updates to nb.po
Hpbirkeland Aug 25, 2026
6e21d6c
build(deps): bump docker/build-push-action from 6 to 7
dependabot[bot] Aug 24, 2026
f36fe82
build(deps): bump docker/login-action from 3 to 4
dependabot[bot] Aug 24, 2026
b6c911a
Avoid double free in allocation failure exit path
victoryforce Aug 25, 2026
51420e0
Cosmetic: change pointer arith to array indexing
victoryforce Aug 25, 2026
a2e2a32
iop: share the contrasting cursor frame color between correction modules
Christian-Bouhon Aug 22, 2026
3a00889
iop: route toneequal and colorequal cursor changes through the helpers
Christian-Bouhon Aug 23, 2026
3bde842
A larger, more dynamic area for measuring the average gray level belo…
Christian-Bouhon Aug 24, 2026
20cd90e
iop/colorequal: bugfix hide correction cursor when mask editor is vis…
Christian-Bouhon Aug 24, 2026
87624a5
masks: don't smooth path tangents across narrow spikes
andriiryzhkov Aug 25, 2026
2af2a48
Do not exit the app if mipmap buffer allocation fails
victoryforce Aug 22, 2026
ecf25a8
gtk4-prep: Restore log history popover activation
Arecsu Aug 22, 2026
62f7ee0
lighttable: hide stale loading overlay for fallback mipmaps
Arecsu Aug 22, 2026
20ab881
Check if the WebPPictureImportRGBX call was successful
victoryforce Aug 23, 2026
d941484
Bump libheif version to the latest for AppImage build
victoryforce Aug 26, 2026
436eedd
log_history: Fix notification reapearing when switching views.
TurboGit Aug 26, 2026
9979495
Add --print-paths / --print-paths-as-flags
sjmudd Aug 17, 2026
9fff98a
Support Canon CNIJMediaType printer option (#21689)
carlosbuitragosan Aug 26, 2026
7a76c46
Remove tautological comparison to avoid compiler warning
victoryforce Aug 26, 2026
ceacd65
Fix dt_cache_get_with_caller to return NULL in case of invalid argument
victoryforce Aug 22, 2026
4155ef6
Catch NULL before trying to dereference it
victoryforce Aug 22, 2026
fcc7c65
darkroom: refresh image info and bottom toolbars
Arecsu Aug 22, 2026
7c2d22d
darkroom: redraw footer toolbar children during image changes
Arecsu Aug 22, 2026
116a392
darkroom: defer footer redraw until image changes settle
Arecsu Aug 22, 2026
2114d26
darkroom: defer center redraw until pipe completion
Arecsu Aug 22, 2026
7318408
fix: keep duplicate manager row width stable
Arecsu Aug 23, 2026
f13816d
Merge pull request #21941 from zisoft/metadata-contactinfo-struct
zisoft Aug 26, 2026
7201f0e
Return NULL early on allocation failure
victoryforce Aug 26, 2026
8ce6a04
Add overflow guard
victoryforce Aug 26, 2026
c15e97d
Delete a source code file that was added a long time ago but never used
victoryforce Aug 25, 2026
e97fff2
win: make the main wrapper C++ compatible
radialmonster Aug 27, 2026
abe1601
Widen int to size_t in pixel loops
victoryforce Aug 25, 2026
a952c2f
Avoid possible NULL-deref and crash in g_strlcpy call
victoryforce Aug 27, 2026
b3012c2
fix collection module update after preset load
zisoft Aug 28, 2026
e744dd2
RELEASE_NOTES.md: collection update with presets.
TurboGit Aug 28, 2026
beb3aa8
Updates to pt_BR
jpellegrini Aug 28, 2026
eaa5a53
Avoid overflow when multiplying
victoryforce Aug 28, 2026
734384a
Exit early in case of uninterpretable image without dimensions
victoryforce Aug 24, 2026
929b8e6
Use default values ​​for tags that may be missing
victoryforce Aug 24, 2026
5e19bbd
Exit early in case of image without photometric interpretation
victoryforce Aug 24, 2026
b627bba
Clamp neural restore's seam flush to the working area
andriiryzhkov Aug 28, 2026
a46eecf
Clamp the linear neural restore path's tile seams too
andriiryzhkov Aug 28, 2026
d6305d8
RELEASE_NOTES.md: neural restore raw denoise crash
andriiryzhkov Aug 28, 2026
dc644e4
Refuse tile sizes the seam blending cannot handle
andriiryzhkov Aug 28, 2026
c7f6cee
Add Canon printer fix to release notes
carlosbuitragosan Aug 29, 2026
8d20446
RELEASE_NOTES.md: add AI features notes
andriiryzhkov Aug 29, 2026
d4e8d9b
RELEASE_NOTES.md: minor reformatting.
TurboGit Aug 29, 2026
9f1e35c
opencl: make the bilinear resampling kernels reusable (#22042)
da-phil Aug 29, 2026
a7d855a
blending: read the mask back from the device before publishing it as …
masterpiga Aug 29, 2026
041133f
clean up code
deekayhd Jun 3, 2026
8611933
remove control from thumbnauil
deekayhd Aug 30, 2026
898b257
fix errors
deekayhd Aug 30, 2026
9791a68
fix errors
deekayhd Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .ci/Brewfile
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,15 @@ brew 'lua@5.4', link: true, overwrite: true
brew 'libomp', link: true
brew 'ninja'
brew 'onnxruntime'
brew 'opencv'
brew 'openexr'
brew 'openjpeg'
brew 'osm-gps-map'
brew 'portmidi'
brew 'potrace'
brew 'pugixml'
brew 'sdl2'
brew 'sdl3'
brew 'shared-mime-info'
brew 'curl'
brew 'perl'
Expand Down
5 changes: 5 additions & 0 deletions .ci/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ RUN rm -rf /var/lib/apt/lists/* && apt-get update && \
liblua5.2-dev \
liblua5.3-dev \
libomp-$LLVM_VER-dev \
libopencv-calib3d-dev \
libopencv-core-dev \
libopencv-features2d-dev \
libopencv-flann-dev \
libopencv-imgproc-dev \
libopenexr-dev \
libopenjp2-7-dev \
libosmgpsmap-1.0-dev \
Expand Down
120 changes: 120 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# Use Ubuntu 26.04 LTS to match the CI environment
# CI uses ubuntu:26.04 container in .github/workflows/ci.yml
FROM ubuntu:26.04

# Avoid prompts from apt
ENV DEBIAN_FRONTEND=noninteractive

# Set up locale
RUN apt-get update && apt-get install -y locales && \
locale-gen en_US.UTF-8 && \
update-locale LANG=en_US.UTF-8 && \
rm -rf /var/lib/apt/lists/*

ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8

# Match the CI "Update base packages" step
RUN apt-get update && apt-get install -y eatmydata && \
eatmydata apt-get --yes upgrade && \
rm -rf /var/lib/apt/lists/*

# Install compilers matching CI:
# - Primary: GNU16 (gcc-16 / g++-16)
# - Alternative: LLVM22 (clang-22 / clang++-22)
RUN eatmydata apt-get update && eatmydata apt-get --yes install \
gcc-16 \
g++-16 \
clang-22 \
libomp-22-dev \
llvm-22-dev \
libc++-22-dev \
libc++abi1 \
lld-22 \
clang-tools-22 \
mlir-22-tools \
libmlir-22-dev \
&& rm -rf /var/lib/apt/lists/*

# Install base dependencies — exact match with CI
# (see "Install Base Dependencies" step in .github/workflows/ci.yml)
RUN eatmydata apt-get update && eatmydata apt-get --yes install \
build-essential \
cmake \
appstream-util \
desktop-file-utils \
gettext \
git \
gdb \
intltool \
libarchive-dev \
libatk1.0-dev \
libavif-dev \
libcairo2-dev \
libcmocka-dev \
libcolord-dev \
libcolord-gtk-dev \
libcups2-dev \
libcurl4-gnutls-dev \
libexiv2-dev \
libgdk-pixbuf-2.0-dev \
libglib2.0-dev \
libgmic-dev \
libgphoto2-dev \
libgraphicsmagick1-dev \
libgtk-3-dev \
libheif-dev \
libjpeg-dev \
libjson-glib-dev \
liblcms2-dev \
liblensfun-dev \
liblua5.4-dev \
libonnxruntime-dev \
libopencv-calib3d-dev \
libopencv-core-dev \
libopencv-features2d-dev \
libopencv-flann-dev \
libopencv-imgproc-dev \
libopenexr-dev \
libopenjp2-7-dev \
libosmgpsmap-1.0-dev \
libpango1.0-dev \
libpng-dev \
libportmidi-dev \
libpotrace-dev \
libpugixml-dev \
libraw-dev \
librsvg2-dev \
libsaxon-java \
libsdl2-dev \
libsecret-1-dev \
libsqlite3-dev \
libtiff5-dev \
libwebp-dev \
libx11-dev \
libxml2-dev \
libxml2-utils \
ninja-build \
perl \
po4a \
python3-jsonschema \
xsltproc \
zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*

# Install packages useful for building AppImages for GUI testing on host machine
# TODO: Remove this layer once we have a dedicated AppImage container
RUN eatmydata apt-get update && eatmydata apt-get --yes install \
# Required for building AppImages
wget \
# OpenCL support (optional GPU acceleration)
ocl-icd-opencl-dev \
# JXL image format
libjxl-dev \
&& rm -rf /var/lib/apt/lists/*

# Set the working directory
WORKDIR /workspace

CMD ["/bin/bash"]
232 changes: 232 additions & 0 deletions .devcontainer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
# Darktable Container Build Environment

A Docker/Podman image that **exactly mirrors the CI compile check**, with all
build dependencies pre-installed. It is an **optional** complement to building
natively — every contributor can continue using their own environment as before.

## Use cases

- **Immutable/atomic Linux** (Fedora Silverblue, NixOS, SteamOS, etc.): avoids
installing and layering 50+ build packages that break on weekly OS rebuilds.
- **Infrequent contributors**: get a working build environment without a
permanent setup.
- **Reproducing CI failures**: your local environment matches the CI container
exactly, so a build that passes here passes CI.
- **Sandboxing AI coding agents**: tools running inside the container can only
access the mounted workspace — host SSH keys, credentials, private documents,
and other projects remain invisible to them.

## Prerequisites: Docker or Podman

Docker (or Podman) is required for all usage options below. Install one:

| Platform | Command / link |
| -------- | -------------- |
| Debian / Ubuntu | `sudo apt install docker.io` or [Docker CE](https://docs.docker.com/engine/install/ubuntu/) (recommended — includes BuildKit) |
| Fedora / RHEL | `sudo dnf install docker` or [Docker CE](https://docs.docker.com/engine/install/fedora/) |
| Arch | `sudo pacman -S docker` |
| openSUSE | `sudo zypper install docker` |
| macOS | `brew install --cask docker` or `brew install podman` |
| Windows | [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) |

On Linux, add your user to the `docker` group and log out/in before using it:

```bash
sudo usermod -aG docker "$USER"
```

**Podman** is a rootless drop-in replacement on Linux (`alias docker=podman`).
See the [Podman installation guide](https://podman.io/docs/installation).

## Option 1: Docker/Podman CLI (most lightweight)

No IDE, no extra tooling — just build and run the container directly.

```bash
# Build the image once (from the repository root)
docker build -t darktable-dev -f .devcontainer/Dockerfile .

# Verify the build compiles (same environment as CI)
docker run --rm --user "$(id -u):$(id -g)" \
-v "$PWD":/workspace -w /workspace \
darktable-dev \
bash -lc './build.sh --prefix /tmp/dt --build-type Release'

# Build an AppImage for GUI testing on the host
docker run --rm --user "$(id -u):$(id -g)" \
-v "$PWD":/workspace -w /workspace \
-e APPIMAGE_EXTRACT_AND_RUN=1 \
darktable-dev \
bash -lc './tools/appimage-build-script.sh'
```

The AppImage appears in `build/Darktable-*.AppImage` and can be run on the host.

> Replace `docker` with `podman` if you use Podman.

## Option 2: Dev Container (richest experience)

A [Dev Container](https://containers.dev/) adds IDE integration on top of the
same Docker image: editor extensions, CMake integration, debugger support, etc.

### VS Code

Install the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers),
then open this repository and click **"Reopen in Container"** when prompted
(or F1 → *Dev Containers: Reopen in Container*). Git submodules are initialized
automatically.

### JetBrains IDEs (CLion, etc.)

Install the Dev Containers plugin and follow the
[JetBrains Dev Containers guide](https://www.jetbrains.com/help/idea/connect-to-devcontainer.html).

### Other editors and terminal

Install the [`devcontainer` CLI](https://github.com/devcontainers/cli):

```bash
npm install -g @devcontainers/cli
```

Then:

```bash
# Start the container
devcontainer up --workspace-folder .

# Open a shell
devcontainer exec --workspace-folder . bash
```

> **VS Code and JetBrains bundle their own devcontainer implementation** — you
> only need to install the CLI separately when using other editors or working
> purely in a terminal.

The VS Code extensions listed in [`devcontainer.json`](devcontainer.json) are
all from Microsoft (`ms-vscode.*`) or well-established publishers.

## Building darktable

Inside the container (any option):

```bash
# Standard development build
./build.sh --prefix /tmp/dt --build-type RelWithDebInfo

# Debug build
./build.sh --prefix /tmp/dt --build-type Debug

# Switch to Clang 22 (matches CI LLVM22 path)
export CC=clang-22 CXX=clang++-22
./build.sh --prefix /tmp/dt --build-type RelWithDebInfo
```

## Testing with AppImage

The container has no display. GUI testing uses an AppImage built inside the
container and run on the host.

```bash
# APPIMAGE_EXTRACT_AND_RUN=1 is required — FUSE is not available in containers
APPIMAGE_EXTRACT_AND_RUN=1 ./tools/appimage-build-script.sh
```

The AppImage is created in `build/Darktable-*.AppImage`. Run it on the host:

```bash
chmod +x build/Darktable-*.AppImage
./build/Darktable-*.AppImage --configdir ~/.config/darktable-test
```

Using `--configdir` avoids touching your production darktable configuration.

## Running unit tests

`libcmocka-dev` is already installed:

```bash
./build.sh --prefix /tmp/dt --build-type RelWithDebInfo -- -DBUILD_TESTING=ON
cd build && ctest
```

## CI environment and pre-built images

The [Dockerfile](Dockerfile) is the single source of truth for the build
environment. Inspect it for the exact base image, compiler versions, and
package list.

### Pre-built images on GHCR

`.github/workflows/build-docker.yml` automatically builds the image and
publishes it to the GitHub Container Registry (GHCR) whenever the `Dockerfile`
changes on the `master` branch. The pre-built image is available at:

```
ghcr.io/darktable-org/darktable-build:latest
```

Using the pre-built image skips the local build step:

```bash
docker pull ghcr.io/darktable-org/darktable-build:latest
docker run --rm --user "$(id -u):$(id -g)" \
-v "$PWD":/workspace -w /workspace \
ghcr.io/darktable-org/darktable-build:latest \
bash -lc './build.sh --prefix /tmp/dt --build-type Release'
```

## Troubleshooting

### `docker build` prints a deprecation warning about the legacy builder

This happens with older Docker installations (e.g. Ubuntu's `docker.io` package)
that don't use BuildKit by default. Fix by installing Docker CE via the
[official Docker Engine docs](https://docs.docker.com/engine/install/ubuntu/)
(which includes `docker-buildx-plugin`), or just add the plugin to an existing
installation:

```bash
sudo apt install docker-buildx-plugin
```

### AppImage build fails with FUSE error

Always set `APPIMAGE_EXTRACT_AND_RUN=1` — FUSE is not available inside containers.

### Git submodules not initialized

```bash
git submodule update --init --recursive
```

### Git says the repository has dubious ownership inside the container

Pass `--user "$(id -u):$(id -g)"` to `docker run` (as shown in the examples
above), or mark the path as safe inside the container:

```bash
git config --global --add safe.directory /workspace
```

### Need to install an extra package temporarily

```bash
sudo apt-get update && sudo apt-get install <package>
```

### Rebuild the container after Dockerfile changes

VS Code: F1 → *Dev Containers: Rebuild Container*
CLI: `devcontainer up --workspace-folder . --remove-existing-container`

## File structure

```text
.devcontainer/
├── Dockerfile # Build environment (mirrors CI)
├── devcontainer.json # IDE/tooling configuration
└── README.md # This file
.github/workflows/
└── build-docker.yml # Publishes the image to GHCR on Dockerfile changes
```
9 changes: 9 additions & 0 deletions .devcontainer/devcontainer-lock.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"version": "2.5.9",
"resolved": "ghcr.io/devcontainers/features/common-utils@sha256:cb0c4d3c276f157eed17935747e364178d75fee17f55c4e129966f64633deb3a",
"integrity": "sha256:cb0c4d3c276f157eed17935747e364178d75fee17f55c4e129966f64633deb3a"
}
}
}
Loading
Loading