<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>News on Ansel</title><link>https://ansel.photos/nl/news/</link><description>Recent content in News on Ansel</description><generator>Hugo -- gohugo.io</generator><language>nl</language><copyright>© Copyright 2022-2025 – Aurélien Pierre</copyright><lastBuildDate>Sun, 04 Dec 2022 01:28:32 +0100</lastBuildDate><atom:link href="https://ansel.photos/nl/news/index.xml" rel="self" type="application/rss+xml"/><item><title>History merge made robust and predictable</title><link>https://ansel.photos/nl/news/history-merge-topology/</link><pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate><updated>Tue, 24 Feb 2026 00:00:00 +0000</updated><guid>4f3ebf8c0318e2c8d98631d6e4b691bf7116c27546cec330d98aaf13e6a93ecf</guid><description>&lt;p>&lt;em>Memoirs of a guy who spent too much time cleaning other people&amp;rsquo;s shit and paying for their bad decisions, episode #too many.&lt;/em>&lt;/p>
&lt;p>Copy/paste history and styles are core features in Ansel, and the one that makes it deserve (or not) its &amp;ldquo;workflow app&amp;rdquo; title. But it is also among the hardest to get right internally. Users see a list of edits, but under the hood those edits depend on the pipeline order, module instances, and masks. If two images have different pipeline topologies, naïvely copying edits can produce inconsistencies.&lt;/p></description></item><item><title>Rewriting keyboard shortcuts (accelerators) from scratch</title><link>https://ansel.photos/nl/news/rewriting-key-shortcuts/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><updated>Sun, 01 Jun 2025 00:00:00 +0000</updated><guid>ec634cc96fcee4dcbd19a0c871db54ab4957b337a5548019c25ee7908b87a375</guid><description>&lt;p>In my defining post,
&lt;a href="https://ansel.photos/nl/news/darktable-dans-le-mur-au-ralenti/" title="" rel="dofollow" >&lt;em>Darktable: crashing into the wall in slow-motion&lt;/em>&lt;/a>, I presented the trainwreck that the new &amp;ldquo;Great MIDI turducken&amp;rdquo; was. The purpose of this turducken&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> was to rewrite the keyboard shortcuts system to extend it for MIDI devices.&lt;/p>
&lt;p>To this day, I&amp;rsquo;m still mad about this enterprise of mass-destruction, here is a recap of he the reasons:&lt;/p>
&lt;ol>
&lt;li>it replaced in 2021 a keyboard shortcuts system that was pretty good, feature-complete, well tested, stable and coded in less than &lt;strong>1500 lines&lt;/strong> (comments included),&lt;/li>
&lt;li>…to add support for MIDI devices and PlayStation gamepads (!?!)…&lt;/li>
&lt;li>…but in my 2022 Darktable survey, one year after this new feature, over 1251 users who participated:
&lt;ul>
&lt;li>81% of users didn&amp;rsquo;t have a MIDI device and didn&amp;rsquo;t plan to get one,&lt;/li>
&lt;li>2% didn&amp;rsquo;t even know what a MIDI device was.&lt;/li>
&lt;li>8% of users had a MIDI device but didn&amp;rsquo;t use it with Darktable,&lt;/li>
&lt;li>6% were considering &lt;em>maybe&lt;/em> getting a MIDI device in the future,&lt;/li>
&lt;li>&lt;strong>2% of users had a MIDI device they actually used in Darktable&lt;/strong>,&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>the code was absolutely terrible, in terms of:
&lt;ul>
&lt;li>code quality: unlegible &lt;code>if&lt;/code>/&lt;code>switch-case&lt;/code> statements nested on 4 levels, in the middle of 1000-lines functions (I posted example snippets in my
&lt;a href="https://ansel.photos/nl/news/darktable-dans-le-mur-au-ralenti/#keyboard-shortcuts" title="" rel="dofollow" >article&lt;/a>),&lt;/li>
&lt;li>code volume:
&lt;ul>
&lt;li>&lt;strong>3546 lines&lt;/strong> of code for Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>4397 lines&lt;/strong> of code for Darktable 5.0,&lt;/li>
&lt;li>the increase in volume is a direct consequence of trying to fix bugs in an architecture that can&amp;rsquo;t be fixed because its complexity promotes more complexity. All that stems from the design, but solving issues created by complexity with adding more complexity is not a solution.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>code complexity:
&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Cyclomatic_complexity" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >cyclomatic complexity&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a>:
&lt;ul>
&lt;li>&lt;strong>1088&lt;/strong> for Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>1245&lt;/strong> for Darktable 5.0 (&lt;a href="https://sonarcloud.io/component_measures?id=aurelienpierreeng_darktable-5&amp;amp;metric=complexity&amp;amp;view=list" title="External link" target="_blank" rel="noopener noreferrer nofollow" >details&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>),&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.sonarsource.com/blog/cognitive-complexity-because-testability-understandability/" title="External link" target="_blank" rel="noopener noreferrer nofollow" >cognitive complexity&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>:
&lt;ul>
&lt;li>&lt;strong>1885&lt;/strong> for Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>2098&lt;/strong> for Darktable 5.0 (&lt;a href="https://sonarcloud.io/component_measures?metric=cognitive_complexity&amp;amp;view=list&amp;amp;id=aurelienpierreeng_darktable-5" title="External link" target="_blank" rel="noopener noreferrer nofollow" >details&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>it is by far the most complex feature of the software, even though it does not operate on images. As a comparison, the second most complex feature is the EXIF metadata decoding, which has a cognitive complexity of &lt;strong>1348&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>it doesn&amp;rsquo;t decode key modifiers &lt;strong>by design&lt;/strong>, but only deals with hardware key-strokes, which means:
&lt;ul>
&lt;li>&amp;ldquo;1&amp;rdquo; input from the numeric pad is decoded &lt;code>Keypad End&lt;/code>,&lt;/li>
&lt;li>&amp;ldquo;1&amp;rdquo; input from a French AZERTY keyboard is decoded &lt;code>Shift+&amp;amp;&lt;/code>, or &lt;code>Shift+&amp;quot;&lt;/code> on BÉPO,&lt;/li>
&lt;li>you therefore need to duplicate all your number-based shortcuts for each way of entering a number, and be prepared for the shortcut settings window to not contain any actual number in the key combinations.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>the user-end design is absolutely terrible, with way too many actions and emulations to configure (&amp;ldquo;effects&amp;rdquo;), that are not even fully documented 4 years later (what is &amp;ldquo;ctrl-toggle&amp;rdquo; ? &amp;ldquo;right-activate&amp;rdquo; ?), and the shortcut configuration uses a weird split-window that doesn&amp;rsquo;t make any sense,&lt;/li>
&lt;li>the implementation is also terrible: the feature is aware of all the software GUI, and the software GUI is aware of the shortcuts code. There is no modularity here, and changing anything in the shortcuts code may have unexpected and undesired effect anywhere in the software.&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> Just see the dependency graph below,&lt;/li>
&lt;li>several &amp;ldquo;shortcuts&amp;rdquo; (or MIDI bindings) can be attached to the same action, which means every user interaction has to lookup the whole list of available actions, inducing very inefficient shortcut handling, GUI lags in some cases and &amp;ldquo;unknown key combination&amp;rdquo; false positives in peculiar cases.&lt;/li>
&lt;/ol>
&lt;figure class="img-wrapper caption-figure" id="shortcuts-brokenpng">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;shortcuts-brokenpng&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/shortcuts-broken.png', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;shortcuts-brokenpng&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/shortcuts-broken.png alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/shortcuts-broken_hu_37da4ddfba37297.png 140w, https://ansel.photos/shortcuts-broken_hu_2ca56332c4a639fc.png 264w, https://ansel.photos/shortcuts-broken_hu_8894f2c5978674fe.png 331w, https://ansel.photos/shortcuts-broken_hu_bc265109b1e12781.png 400w, https://ansel.photos/shortcuts-broken_hu_d9d6e746b11eb2e5.png 496w, https://ansel.photos/shortcuts-broken_hu_ef3f427f08f0988e.png 576w, https://ansel.photos/shortcuts-broken_hu_42b4918b27cbec62.png 600w, https://ansel.photos/shortcuts-broken_hu_c18353f82cd93b8b.png 720w, https://ansel.photos/shortcuts-broken_hu_f875cf7401de6b2b.png 800w, https://ansel.photos/shortcuts-broken_hu_329e0f33193bcc21.png 992w, https://ansel.photos/shortcuts-broken_hu_3e979df69b871fbc.png 1200w, https://ansel.photos/shortcuts-broken_hu_5fce2b3bbfaa9bba.png 1320w, https://ansel.photos/shortcuts-broken_hu_324828f59d54c82b.png 1440w, https://ansel.photos/shortcuts-broken_hu_1af3de6d2fb4e36e.png 1600w, https://ansel.photos/shortcuts-broken_hu_8d207886803761a.png 1920w, https://ansel.photos/shortcuts-broken_hu_7ac56fd0b2cf2d5c.png 2048w"width="2508" height="1674"/>
&lt;/div>
&lt;figcaption>
Non-decoded number keys and weird window splitting between "action" and "shortcut".
&lt;/figcaption>
&lt;/figure>
&lt;figure class="img-wrapper caption-figure" id="accelerators-beforejpg">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;accelerators-beforejpg&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/accelerators-before.jpg', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;accelerators-beforejpg&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/accelerators-before.jpg alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/accelerators-before_hu_7bfdceacd2bb7c89.jpg 140w, https://ansel.photos/accelerators-before_hu_d7938822cb09ca35.jpg 264w, https://ansel.photos/accelerators-before_hu_fcf7d3d779c1e468.jpg 331w, https://ansel.photos/accelerators-before_hu_e21dbd9378dd11aa.jpg 400w, https://ansel.photos/accelerators-before_hu_deb5f0ca868df06f.jpg 496w, https://ansel.photos/accelerators-before_hu_4bb52b8bdd9be52c.jpg 576w, https://ansel.photos/accelerators-before_hu_69881a278551351a.jpg 600w, https://ansel.photos/accelerators-before_hu_22c484c4dbe786e6.jpg 720w, https://ansel.photos/accelerators-before_hu_966ee3fdb6fc09ce.jpg 800w, https://ansel.photos/accelerators-before_hu_532d40704d99e3eb.jpg 992w, https://ansel.photos/accelerators-before_hu_67b7df50fe19e136.jpg 1200w, https://ansel.photos/accelerators-before_hu_543c1dc8e601743b.jpg 1320w, https://ansel.photos/accelerators-before_hu_d59a4cf0b04746dc.jpg 1440w, https://ansel.photos/accelerators-before_hu_a6ec2bd03f3faac7.jpg 1600w, https://ansel.photos/accelerators-before_hu_bccb1b41efcab977.jpg 1920w, https://ansel.photos/accelerators-before_hu_acdb628243edd870.jpg 2048w"width="3730" height="1912"/>
&lt;/div>
&lt;figcaption>
&lt;p>The dependency graph of &lt;code>src/gui/accelerators.c&lt;/code> (Great MIDI turducken) before the rewrite. Guess why we call it &amp;ldquo;&lt;a href="https://en.wikipedia.org/wiki/Spaghetti_code" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >spaghetti code&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a>&amp;quot;… This makes it clear that there is a double-sided dependency between the accels code and the rest of the GUI code. This is a nightmare to maintain.&lt;/p></description></item><item><title>Welcome Ansel GPT !</title><link>https://ansel.photos/nl/news/welcome-ansel-gpt/</link><pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate><updated>Sat, 03 May 2025 00:00:00 +0000</updated><guid>3c3339076df3d8efb312872bbb4070665e577850dbc2593e72c9f0d0c4d513d9</guid><description>&lt;p>After I finally
&lt;a href="https://ansel.photos/nl/contribute/translating/" title="" rel="dofollow" >wired the whole website and docs&lt;/a> to a water-tight translation workflow (using po4a on top of Hugo), which happens to use the exact same toolset and logic as the Ansel application, I got the idea of
&lt;a href="https://ansel.photos/nl/contribute/translating/#auto-tools-and-helper-scripts" title="" rel="dofollow" >automating empty translations&lt;/a>, first from the software translation files, then through ChatGPT API, which does a very fair job at translating Markdown syntax.&lt;/p>
&lt;p>Working alone, you can&amp;rsquo;t rely on &lt;a href="https://en.wikipedia.org/wiki/Social_loafing" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >social loafing&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a>, so you have to be clever. You can see
&lt;a href="https://ansel.photos/nl/contribute/workflows/" title="" rel="dofollow" >the list of things I have already automated&lt;/a> in background for Ansel.&lt;/p></description></item><item><title>Welcome, developer documentation !</title><link>https://ansel.photos/nl/news/welcome-dev-docs/</link><pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate><updated>Mon, 31 Mar 2025 00:00:00 +0000</updated><guid>64a86dbc19dc2ed62c9704929644ac0d4b992304c211cbdf4568bb47a4e37eed</guid><description>&lt;p>Back in December 2019, I asked that someone &lt;a href="https://github.com/darktable-org/darktable/issues/3925" title="External link" target="_blank" rel="noopener noreferrer nofollow" >took care of providing AppImages packages&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a> for Darktable. The obvious benefit would have been enabling early testing, prior to release, from people who can&amp;rsquo;t build the source code themselves, as to &lt;em>hopefully&lt;/em> provide early feedback and help debugging &lt;strong>before&lt;/strong> releasing. This has never been a priority, which means that it was ok to have a pre-release &lt;strong>and&lt;/strong> a post-release rush to fix bugs.&lt;/p></description></item><item><title>Fixing the pipeline cache and 10 years-old bugs</title><link>https://ansel.photos/nl/news/fixing-pipe-cache-10-yo-bugs/</link><pubDate>Sun, 07 Jul 2024 00:00:00 +0000</pubDate><updated>Sun, 07 Jul 2024 00:00:00 +0000</updated><guid>550c016ef1b019c5d1cb146fea73e15b51fbcd2bc20619f74cd3c4e5cbceeab5</guid><description>&lt;/section>
&lt;section id="recap-of-the-previous-episodes">
&lt;h2 class="text-left heading">
Recap of the previous episodes
&lt;span class="header-filet">&lt;/span>
&lt;/h2>
&lt;ol start="0">
&lt;li>Between 2020 and 2022,
&lt;a href="https://ansel.photos/nl/news/darktable-dans-le-mur-au-ralenti/" title="" rel="dofollow" >Darktable underwent a mass-destruction enterprise&lt;/a>, by a handful of guys with more freetime and benevolence than actual skills,&lt;/li>
&lt;li>In 2022, &lt;a href="https://github.com/aurelienpierreeng/ansel/issues/29" title="External link" target="_blank" rel="noopener noreferrer nofollow" >I started noticing an annoying lag&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a> between GUI interactions with sliders controls and feedback/update of said sliders. For lack of feedback stating that the value change was recorded, users could change it again, thereby starting additionnal pipeline recomputes and effectively freezing their computer because stupid GUI never said &amp;ldquo;got you, wait for a bit now&amp;rdquo;.&lt;/li>
&lt;li>I discovered that pipeline recomputations orders were issued twice per click (once on &amp;ldquo;button pushed&amp;rdquo;, once on &amp;ldquo;button released&amp;rdquo; events), and once again for each mouse motion, but also that the GUI states were updated seemingly after pipe recompute.&lt;/li>
&lt;li>I
&lt;a href="https://ansel.photos/nl/news/undarktable-ing-gui-controls/" title="" rel="dofollow" >fixed that&lt;/a> by almost rewriting the custom GUI controls (Bauhaus lib). I thought that preventing reckless recompute orders was gonna solve the lag : it didn&amp;rsquo;t. Then, I discovered that requesting a new pipeline recompute before the previous ended waited for the previous to end, despite a shutdown mechanism implemented many years ago that should have worked.&lt;/li>
&lt;li>I
&lt;a href="https://ansel.photos/nl/news/implementing-kill-switch/" title="" rel="dofollow" >fixed that&lt;/a> by implementing a kill-switch mechanism on pipelines, following comments in the code from the 2010&amp;rsquo;s and internal utilities that may well have never worked. This did not always work because the kill order came often with a noticeable delay. Once again, the GUI lag was not fixed.&lt;/li>
&lt;/ol>
&lt;p>…&lt;/p></description></item><item><title>Rewriting the import tool</title><link>https://ansel.photos/nl/news/rewriting-import/</link><pubDate>Fri, 07 Jun 2024 00:00:00 +0000</pubDate><updated>Fri, 07 Jun 2024 00:00:00 +0000</updated><guid>92037554190859d5faef3251312d38aa60aee47d057e9b544ea17d9a323cd23b</guid><description>&lt;p>Ansel inherits from Darktable its database backbone: the non-destructive editing histories are saved per-picture into an SQLite database, along with metadata and other user-defined data. Making the database aware of new pictures is done through &amp;ldquo;importing&amp;rdquo; pictures from a disk or a memory card. That&amp;rsquo;s where the import tool comes.&lt;/p>
&lt;p>Unfortunately, the Darktable importer is another thing that was butchered circa 2020 and turned into something deeply disconcerning, as it is a file browser that resembles no previously-known file browser, and manages to lack basic features (like Ctrl+F or EXIF preview) while still being bloated with useless ones (see below). This is where we loose many a future user, and it is only step 0 of the workflow. What a great showcase of what a &amp;ldquo;workflow app&amp;rdquo; can do !&lt;/p></description></item><item><title>Implementing kill-switch on pipeline</title><link>https://ansel.photos/nl/news/implementing-kill-switch/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate><updated>Tue, 28 Nov 2023 00:00:00 +0000</updated><guid>c38c759d7c7dfad8f32c4581206b5384766dfa8c314c657ed72868a1bf6984c2</guid><description>&lt;p>I have thought, for a very long time, that there was some kill-switch mechanism on the pixel pipeline. The use case is the following :&lt;/p>
&lt;ol>
&lt;li>you are changing a module parameter,&lt;/li>
&lt;li>the previews (the central darkroom one and the thumbnail in left panel, also used for histogram and color pickers) recompute their pipeline to account for that change,&lt;/li>
&lt;li>one of the previews finishes rendering before the other, and the result is obviously &lt;strong>not&lt;/strong> what you wanted,&lt;/li>
&lt;li>you change again the module parameter, without waiting for the recomputation to finish.&lt;/li>
&lt;/ol>
&lt;p>In that case, you want to kill all active pipelines because their output will not be used, and start recomputing everything immediately with new parameters. Except Darktable doesn&amp;rsquo;t do that, it lets the pipeline finish before restarting it, and looking at the comments in the source code, it seems to be a fairly recent regression and not the originally intended behaviour.&lt;/p></description></item><item><title>Un-darktable-ing GUI controls</title><link>https://ansel.photos/nl/news/undarktable-ing-gui-controls/</link><pubDate>Sat, 25 Nov 2023 00:00:00 +0000</pubDate><updated>Sat, 25 Nov 2023 00:00:00 +0000</updated><guid>5f4c23d54314b065de427a10d615abf8f9c353fe9229e40f97181e9332588fee</guid><description>&lt;p>Darktable has its own GUI widgets library, for sliders and comboboxes (aka drop-down menus or selection boxes), called Bauhaus (in the source code, it&amp;rsquo;s in &lt;code>src/bauhaus/bauhaus.c&lt;/code>). While they use Gtk as a backend, Bauhaus are custom objects. And like many things in Darktable, custom equals rotten.&lt;/p>
&lt;p>In 2022, ‍I noticed &lt;a href="https://github.com/aurelienpierreeng/ansel/issues/29" title="External link" target="_blank" rel="noopener noreferrer nofollow" >parasite redrawings and lags&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>, when using them, leading to a frustrating user experience : the widget redrawing seemed to wait for pipeline recomputations to complete, which meant that users were not really sure their value change was recorded, which could lead them to try again, starting another cycle of expensive recomputation, and effectively freezing their computer for several very frustrating minutes of useless intermediate pipeline recomputations.&lt;/p></description></item><item><title>Changes in distribution support for Linux AppImage package</title><link>https://ansel.photos/nl/news/changes-appimage/</link><pubDate>Sat, 18 Nov 2023 00:00:00 +0000</pubDate><updated>Sat, 18 Nov 2023 00:00:00 +0000</updated><guid>ed7bb2f3543fa0ed00f10d7e2a31ff55b4011df9d9890b5b2315a5cea134ac47</guid><description>&lt;p>Rawspeed (the library providing the decoders for camera raw files) has deprecated support for GCC &amp;lt; 12. As a result, I can no longer build the AppImage on Ubuntu 20.04 (using Github runners) but I have to build it on 22.04.&lt;/p>
&lt;p>It means any Linux distribution having libc older than 2.35 will not be able to start the new AppImages starting today. That should not affect most users running distributions upgraded in 2021 or more recently. Ubuntu 20.04 and other LTS/old stable distributions (Debian stable) may be affected.&lt;/p></description></item><item><title>Explaining Ansel redesign of module groups</title><link>https://ansel.photos/nl/news/modules-groups-redesign/</link><pubDate>Tue, 27 Jun 2023 00:00:00 +0000</pubDate><updated>Tue, 27 Jun 2023 00:00:00 +0000</updated><guid>b8e6cf61d5feec9b4910efc16e7a83c0f7916201a7bee597fcc0347d57a46431</guid><description>&lt;p>If you come from Darktable, you may be used to this in the darkroom:&lt;/p>
&lt;figure class="img-wrapper " id="ennewsmodules-groups-redesignorganizationpng">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;ennewsmodules-groups-redesignorganizationpng&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/en\/news\/modules-groups-redesign\/organization.png', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;ennewsmodules-groups-redesignorganizationpng&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/en/news/modules-groups-redesign/organization.png alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/en/news/modules-groups-redesign/organization_hu_da76fb6d8feaa617.png 140w, https://ansel.photos/en/news/modules-groups-redesign/organization_hu_b8d9d49bff0f4441.png 264w, https://ansel.photos/en/news/modules-groups-redesign/organization_hu_f80110facb428d83.png 331w, https://ansel.photos/en/news/modules-groups-redesign/organization_hu_380b324ce9cd41c9.png 400w, https://ansel.photos/en/news/modules-groups-redesign/organization_hu_97dc5294f20eca02.png 496w"width="499" height="458"/>
&lt;/div>
&lt;/figure>
&lt;p>while Ansel offers you this:&lt;/p>
&lt;figure class="img-wrapper " id="ennewsmodules-groups-redesignansel-module-groupspng">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;ennewsmodules-groups-redesignansel-module-groupspng&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/en\/news\/modules-groups-redesign\/ansel-module-groups.png', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;ennewsmodules-groups-redesignansel-module-groupspng&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/en/news/modules-groups-redesign/ansel-module-groups.png alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/en/news/modules-groups-redesign/ansel-module-groups_hu_26a9b9ad39eb1624.png 140w, https://ansel.photos/en/news/modules-groups-redesign/ansel-module-groups_hu_d1396d3f66323fbc.png 264w, https://ansel.photos/en/news/modules-groups-redesign/ansel-module-groups_hu_a2521cbeb603fe9e.png 331w, https://ansel.photos/en/news/modules-groups-redesign/ansel-module-groups_hu_da4ed60d55cbc4a5.png 400w, https://ansel.photos/en/news/modules-groups-redesign/ansel-module-groups_hu_ab1ede830b645b6c.png 496w, https://ansel.photos/en/news/modules-groups-redesign/ansel-module-groups_hu_36d59223e30b67f1.png 576w, https://ansel.photos/en/news/modules-groups-redesign/ansel-module-groups_hu_cd98fa05a65140af.png 600w"width="714" height="488"/>
&lt;/div>
&lt;/figure>
&lt;p>This is no accident, and it&amp;rsquo;s time to explain why, and why this will not be extended with customization options.&lt;/p></description></item><item><title>New build options for Linux</title><link>https://ansel.photos/nl/news/new-build-options-linux/</link><pubDate>Fri, 16 Jun 2023 00:00:00 +0000</pubDate><updated>Fri, 16 Jun 2023 00:00:00 +0000</updated><guid>9c5bbd9e14ff03bda50651d18bef16606c3a0478dcf1f7fa6a145c71861f4b40</guid><description>&lt;p>I accidentally discovered that the Linux build script used a &amp;ldquo;package&amp;rdquo; build, meaning the CPU optimizations are limited to generic ones in order to produce portable binaries that can be installed on any x86-64 platform. By &amp;ldquo;using&amp;rdquo;, I mean the package build was not explicitely disabled, so it was enabled by default.&lt;/p>
&lt;p>Anyway, this is now disabled by default, since the actual packages (.exe and .appimage) are not built through that script, which is primarily meant to help end-users. To get the previous behaviour back, you would need to run:&lt;/p></description></item><item><title>Dev diary #2 : introducing Chantal</title><link>https://ansel.photos/nl/news/dev-diary-2/</link><pubDate>Fri, 28 Apr 2023 00:00:00 +0000</pubDate><updated>Fri, 28 Apr 2023 00:00:00 +0000</updated><guid>4787a01a808737ad5918ac2dd945beb651ea887b1e4640115a4df8b087b9bfe5</guid><description>&lt;p>2022 was so bad in terms of junk emails and noise that I started the &lt;a href="https://virtualsecretary.aurelienpierre.com/" title="External link" target="_blank" rel="noopener noreferrer nofollow" >Virtual Secretary&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>, a Python framework to write intelligent email filters by crossing information between several sources to guess what incoming emails are and whether they are important/urgent or not. When I&amp;rsquo;m talking about junk emails, it&amp;rsquo;s also Github notifications, pings on pixls.us (thank God I closed my account on that stupid forum), YouTube, and direct emails from people hoping to get some help in private.&lt;/p></description></item><item><title>Dev diary</title><link>https://ansel.photos/nl/news/dev-diary-1/</link><pubDate>Sun, 19 Mar 2023 00:00:00 +0000</pubDate><updated>Sun, 19 Mar 2023 00:00:00 +0000</updated><guid>7b10a8353b31a5e1b4b080bedac97b843375e88c80d3e9a7da547872b37f845e</guid><description>&lt;p>It&amp;rsquo;s been roughly 3 months that I rebranded &amp;ldquo;R&amp;amp;Darktable&amp;rdquo; (that nobody seemed to get right), into &amp;ldquo;Ansel&amp;rdquo;, then bought the domain name and created the website from scratch with Hugo (I had never programmed in Golang before, but it&amp;rsquo;s mostly template code).&lt;/p>
&lt;p>Then I spent a total 70 h on making the nightly packages builds for Windows and Linux work for continuous delivery, something that Darktable never got right (&amp;ldquo;you can build yourself, it&amp;rsquo;s not difficult&amp;rdquo;), only to see the bug tracker blow up after release (nothing better than chaining the pre-release sprint with a post-release one to reduce your life expectancy).&lt;/p></description></item><item><title>Darktable : crashing into the wall in slow-motion</title><link>https://ansel.photos/nl/news/darktable-dans-le-mur-au-ralenti/</link><pubDate>Wed, 15 Feb 2023 18:14:01 +0100</pubDate><updated>Wed, 15 Feb 2023 18:14:01 +0100</updated><guid>b275f06cf302a6e20089d777adc4186da5a40fd12b8b6f0c2e7ce7d20ddc79f9</guid><description>&lt;p>What happens when a gang of amateur photographers, turned into amateur developers, joined by a bunch of back-end developers who develop libraries for developers, decide to work without method nor structure on an industry software for end-users, which core competency (colorimetry and psychophysics) lies somewhere between a college degree in photography and a master&amp;rsquo;s degree in applied sciences, while promising to deliver 2 releases each year without project management ? All that, of course, in a project where the founders and the first generation of developers moved on and fled ?&lt;/p></description></item></channel></rss>