• DarkRoom 0.18.2
    Benchmarks / CPU and I/O (per commit) (push) Successful in 5m34s
    Benchmarks / Frame budget (on demand) (push) Skipped
    Traceability / Requirement traces (push) Successful in 1m0s
    Build and test / Android (aarch64) (push) Successful in 30m28s
    Build and test / android-image (push) Successful in 1s
    🐳 Android image / Build and push (push) Successful in 1s
    Build and test / Desktop (Linux) (push) Successful in 47m53s
    Build and test / windows-image (push) Successful in 1s
    🐳 Windows image / Build and push (push) Successful in 1s
    Build and test / Layer separation (push) Successful in 34s
    Build and test / Windows (x86_64, cross) (push) Successful in 36m29s
    Build and test / Publish the release (push) Successful in 1m10s
    Stable

    dtourolle released this 2026-09-27 12:23:06 +00:00 | 143 commits to master since this release

    Film now works inside local adjustments, hot pixels are repaired before the demosaic, and mask layers finally add to the global edit instead of replacing it. This release also carries 0.18.1's two fixes, whose downloads were never published.

    Film inside local adjustments. In a mask layer, Print exposure burns or dodges that region and Push develops it further; the film stock stays the photograph's own, and where layers overlap the photograph takes the average of their settings. Film push, print exposure and format now respond without re-baking the stock, and print exposure is exact at any setting. Whole-frame film edits render as before (within one 8-bit step). A mask layer that already carried film settings now applies them — they were stored but ignored until now — so such photographs change inside the mask.

    Hot pixels are gone. A hot or dead photosite is repaired on the sensor data before demosaicing, so a long or high-ISO exposure no longer shows coloured crosses where a leaky photosite was. A photosite is replaced only when it stands far above or below every photosite of its own colour around it and every neighbour beside it, so stars and small glints are left alone. Bayer and X-Trans, applied to export too, no setting, and no measurable cost (a Canon 6D frame demosaics in 94–98 ms, against 91–99 ms before). (FR-RAW-3)

    Mask layers add to the global edit (from 0.18.1). A mask layer's settings are applied as offsets to the global ones, at each operation's place in the chain, rather than as a separate edit — so a layer that lifts exposure by a stop lifts it from wherever the global exposure left it.

    Contrast flattens toward grey (from 0.18.1). Lowering contrast pulls tones toward middle grey instead of scaling shadows by a ratio.

    A scroll cue on the tablet. Android's lists and panels show a thin line at the edge while they move, fading when they stop, so a long list says it is long. It takes no touch; the desktop keeps its scrollbars. (#69)

    Under the hood.

    • Every worker thread starts through one module that names its executor and role (net:sync, decode:thumbs…), and a blocking wait on the interface thread now fails loudly in debug builds. (#58, NFR-ARCH-1)
    • CI fails if anything but a person's action — or a verdict carried from another device, a sidecar, or duplicate consolidation — writes a rating, flag, label or trash entry: evidence such as faces, focus or clipping can never become a verdict. (#55, first half)
    • The desktop CI job frees its test binaries before the release build; the runner's disk ran out on 0.18.1's tag, which is why that release has no downloads. A flaky catalog test is fixed.

    No schema change. 0.18.x devices sync with each other and with 0.17.0.

    The APK, the desktop binary, the Windows installer and SHA256SUMS are built by CI from this tag's commit.

    Downloads