I have been using darktable for over three years, and while I have optimized my open-source photography workflow, I feel we are still missing a powerful way to manage complex workflows.
Currently, we apply edits by copying and pasting the history stack.
However, this process applies specific numerical values rather than image-specific logic.
For example, if I use the exposure picker on image A and get a value of +3.030 EV, copying this to image B will apply exactly +3.030 EV. In most cases, image B needs a different adjustment based on its own histogram, not the fixed value from image A.
The intention was “set exposure using the picker”, but the result is a static number.
The Darktable-Initial-Workflow-Module addresses this by providing a simplified UI for some parameters, but it only covers a small selection of module functions.
I am proposing a Lua plugin designed to execute custom, user-defined workflows based on a modular architecture:
~/.config/darktable/lua/dt-workflows/
├── dt-workflows.lua -- plugin entry point
├── engine.lua -- logic to apply settings to images
├── ui.lua -- user interface (buttons/panels)
├── workflows/ -- selection of workflow strategies
│ └── agx_workflow.lua -- e.g. agx color workflow definition
│ └── bw_workflow.lua -- e.g. black and white workflow definition
└── modules/ -- definitions for individual modules
├── color_balance_rgb.lua
├── exposure.lua
├── agx.lua
└── ...
In this system, a workflow is a Lua instruction file containing “intentions” rather than fixed states. For instance, an AgX workflow definition would look like this:
Lua
-- agx_workflow.lua sample
local workflow = {
name = "agx scene-referred workflow",
description = "agx-based workflow automation",
steps = {
{
module = "exposure",
params = {
mode = "auto_picker", -- intention: use the picker, not a fixed value
target_exposure = 0.5,
compensation_bias = 0.0
-- other parameters
}
},
{
module = "color_calibration",
params = {
mode = "auto-picker",
illuminant = "D65",
adaptation = "CAT16"
-- other parameters
}
}
}
}
return workflow
This workflow could be triggered from both the lighttable and darkroom views.
In the lighttable, a user could select a workflow from a dropdown (reading from the workflows folder) and apply it to a batch of selected images with a single click.
In the darkroom, it would apply the workflow to the current image.
The modules/ folder is a key part of this vision. It should contain updated definitions of individual darktable modules to ensure that workflows do not break when core modules are updated. By abstracting the module logic, we ensure long-term stability.
I believe this approach would allow photographers to handle large batches of images with extreme precision and speed, automating the repetitive technical setup and leaving more time for creative editing.
I am not a professional developer: my experience with Lua is mostly limited to Neovim scripting. However, I am a power user who cares deeply about the darktable ecosystem and productivity.
My goal here is twofold: first, I want to understand if other users feel the same need for intentional workflows. If there is enough interest and the community thinks this could be a valuable feature, I would be happy to open a formal feature request on GitHub with a detailed functional specification.
Secondly, I am looking for developers who might be interested in collaborating on this. I can contribute by testing the engine, defining user needs, and refining the workflow logic, but I need help from the experts to build a robust architecture that can survive darktable’s rapid development.
I would love to hear your thoughts!
Is this a direction worth pursuing, or do you see better ways to achieve this level of automation?