There are at least three places where module proliferation is being discussed (Worried about LLM-written modules, [New module] [Packages available] Color harmonizer, [New Module] Skin Tone Editor Module). The conversation is a bit sparse, but it is an interesting one (regardless of how the modules are being authored), so I thought it would be nice to have a separate thread.
This is a long post, so here is my TL;DR if you don’t want to bother reading it all:
- The number of modules is not confusing.
- What is confusing are modules that cannot be differentiated by the function that they provide.
- Modules that provide specialized functionalities should be welcome additions as they reduce the average editing complexity and bring clarity to users workflows while allowing them to retain full control.
If you are brave and want the full, unabridged experience, then brew a nice cup of tea or coffee and dive in ![]()
The false problem of “too many modules”
It has been voiced by more than one person that one of darktable’s usability problems is that it has too many modules. In some cases, too many modules to do similar things. The various way to sharpen and add contrast are brought as an example.
The real issue is not that there are too many modules. The issue is that there are some modules that play similar roles in a workflow, but the differences among them are not at all obvious. When and why I should I use contrast equalizer vs. diffuse or sharpen? Sigmoid vs. Filmic vs. AgX? What is the difference between these sets of modules? It is far from obvious. They all deal with contrast or tone mapping, and they all have a lot of controls. Their names do not help understand which one does what.
In some cases, the difference is in the mathematical model that implements a certain function, but this is not the most sensible way to differentiate modules, because visual editing is result driven, not maths driven. Users want beautiful photos, not photos that are mathematically elegant
. If I want to sharpen a photo, it shouldn’t matter how I do that. What matters is that, at the end, I have a photo sharpened to my taste.
It shouldn’t matter if it’s wavelets or diffusion or whatever, as long as the photo can be sharpened and the process is under control. So, to reiterate, the confusion does not arise from the number of mudules. The confusion arises when multiple modules provide the same functionality and differ only in the implementation details.
Specialized vs. generic modules
At its core, what every module does is shifting pixel values. A single module that allows you to (1) select a bunch of pixels and (2) change their RGB value would in principle serve all editing purposes.
Of course, you wouldn’t be happy with just one module like this, because doing everything would require a lot of time and effort, and the job would be very repetitive.
So, we build abstractions on top of that. We have modules that allow you to change hues, modules that play with saturation, modules that emphasize contrast and so on.
darktable has an excellent collection of relatively low-level, general purpose, fairly complex modules that offer a lot of fine control. The existing modules cover almost any need that you can think of.
However, they are not designed to fulfill specific tasks, and achieving specific results with these modules may be unnecessarily lengthy and cumbersome.
This is exactly where there is the space for specific, targeted modules that implement specialized functionalities with a simple, intuitive UI that does not require too much fiddling.
(I already hear someone saying we should not hide complexity! users have to know what they are doing! we should have full control! don’t dumb it down!. Agreed. Higher-level modules do not hide complexity. They improve usability, reduce the grudge of repetitive tasks and make the editing experience more pleasurable, while leaving you fully in control of the end result.)
darktable already has some of these higher level functionality. The monochrome module is a perfect example. You can achieve similar results with combinations of color calibration, color balance RGB, color equalizer and what not, but the monochrome module packs this functionality into an easy to use, discoverable, non-confusing module. If you want to do monochrome, having a dedicated module to do it is leaps and bounds less confusing than having to fiddle with models that can be used to this end, but are not designed to do that.
Thanks to this one more module, the overall darktable experience is less confusing if you want to do monochrome.
The color harmonizer module that I published a few days ago goes exactly in this direction. With one module instance and 2 or 3 sliders one can achieve effects that, without, would generally require several instances of (possibly masked) lower level modules, each of which has way more sliders than the one instance of color harmonizer.
Such modules increase the size of the module pool AND remove confusion, as functionalities are neatly packed and clearly scoped. They make it possible to achieve the desired results without unnecessary fiddling, while providing the same level of control.
The skin tone editor module (which I have not tried yet because I was too busy writing this post
) potentially falls in the same category. If implemented properly, a tool that would allow easy retouching of skin tones for portrait shooters has the potential of being extremely useful.
Which leads me the following point.
Differentiation is the key
It has been suggested that skin tone editor and color harmonizer should be merged into a single module because they both deal with hues.
Merging these two modules would be a gross mistake: it would replace two specialized, very separate, clearly scoped functionalities with some kind of generic hue editing tool that is optimized for neither. This, yes, would be redundant and confusing, because we already have generic tools for hue editing.
Which modules should be merged into darktable
All that said, how do we decide which modules should become part of the next darktable release, or, even before that, become a PR?
Well, first and foremost, this decision belongs with the core dev team.
As a rule of thumb, and implementation-quality aside, I suggest that a module should be considered for inclusion if:
- It provides a useful technical or artistic functionality
- It is more specialized than existing general purpose tools
- It is easier to use than the corresponding general purpose tools to achieve the same result. The UI is specifically tailored for a certain task, it is simpler, more straightforward and less overwhelming than the closely related “general purpose” modules
- Is well received by the community
- The developer has some kind of proven track of contributions to the project, which means that probably they will stick around to maintain it
You made it!
If you read until here, congratulations! I hope that you found it at least not boring and that you will want to contribute to the discussion with your ideas and suggestions. Thanks for reading!