DarkTable

darktable.org
DarkTable

A photography workflow application (similar to Adbobe Lightroom) Includes a non-destructive raw developer for raw images and managing digital negatives.

Open Source

DarkTable Source Code

Author

darktable-org

Description

darktable is an open source photography workflow application and raw developer

Homepage

https://www.darktable.org

Repository

  • LicenseGPL-3.0
  • Created21 Mar 12
  • Primary languageC
  • Size1,361,925 KB
  • Stars13,253
  • Forks1,464
  • Watchers13,253

Language Usage

Language Usage

Project Health

  • Last commit4 days ago
  • Open issues653
  • Latest releasev5.4.0-ai

Top Contributors

Recent Commits

  • Victor Forsiuk(07 Oct 26)

    Fix broken NULL check

  • Victor Forsiuk(09 Oct 26)

    Ukrainian translation update

  • Pascal Obry(09 Oct 26)

    Merge pull request #22545 from jenshannoschwalm/laplacian_highlights_opencl Fix various OpenCL laplacian hightlight bugs

  • Hanno Schwalm(09 Oct 26)

    Make sure we use only one OpenCL sampler per kernel **rusticl: wrong results when one image is read with two samplers (CLK_ADDRESS_NONE and CLK_ADDRESS_CLAMP_TO_EDGE) in the same kernel** Observed in darktable's `interpolate_and_mask` kernel (data/kernels/basic.cl), PR https://github.com/darktable-org/darktable/pull/22545 Samplers (data/kernels/common.h): ```c constant sampler_t sampleri = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; constant sampler_t samplerA = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_NONE | CLK_FILTER_NEAREST; ``` Kernel pattern (single-channel float image `input`, all coordinates in range): ```c const float center = fmax(0.0f, read_imagef(input, samplerA, (int2)(j, i)).x); ... const float north = read_imagef(input, sampleri, (int2)(j, i - 1)).x; // same image, other sampler // south / west / east / diagonals likewise ``` - Reading `center` with `samplerA` and the neighbours with `sampleri` gives visible artefacts (inf values in the output). - Reading `center` with `sampleri` gives correct results. - Reading everything with `samplerA` (neighbours are guarded by explicit border checks) also gives correct results. - The same kernel is correct on ROCm. hanno checked: image dimensions match the NDRange, and all read coordinates are in range. Expected: identical results for in-range reads regardless of the address mode. Environment: <rusticl version, Mesa version, GPU, OS>

  • Hanno Schwalm(09 Oct 26)

    Fix two OpenCL laplacian hightlight bugs 1. The initial temp buffer requires full image size 2. Fixed bogus wb and clip parameter 3. Use proper float/float4 data while reading from images 4. Use OpenCL mix() instruction and better maths precision for the box blur. 5. Upscale clipping mask before remosaic 6. visible artifacts on rusticl in highlighted areas required special care!

  • Jamal(08 Oct 26)

    po: update Azerbaijani translation

  • Pascal Obry(09 Oct 26)

    Merge branch 'upstream-flexi-prepare' of https://github.com/masterpiga/darktable

  • Pascal Obry(08 Oct 26)

    src/tests/integration: Update sub-module.

  • Pascal Obry(08 Oct 26)

    Merge pull request #22516 from MaykThewessen/codex/fix-pq-hlg-transfer Fix PQ luminance scaling and HLG display conversion

  • piratenpanda(08 Oct 26)

    spektrafilm: fix GCC 15 -Wstringop-overread in _auto_paper_entry Hoist the loop-invariant target_print check out of the loop. GCC 15 at -O3 inlines _auto_paper_entry() into gui_update(), where the film entry can be NULL, and warns about strcmp on that path despite the guard. Fixes #22538 Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01TqtF7u5cHLdfiBm2NNb985

  • Pascal Obry(08 Oct 26)

    Merge pull request #22537 from piratenpanda/spektrafilm_opencl_fixes spektrafilm: opencl fixes

  • Hanno Schwalm(08 Oct 26)

    Report module output OpenCL vs CPU diff statistics Introduce the cli option --opencl-diffstat A complementary debug/analyze option reporting some minimal statistics about OpenCL vs CPU processed output of each module.

  • Pascal Obry(08 Oct 26)

    Merge pull request #22540 from victoryforce/translations-261008 Translations update: en@truecase and Ukrainian

  • Daniele Pighin(08 Oct 26)

    RELEASE_NOTES.md: pre-flexi bugfixes and small UX improvements.

  • Victor Forsiuk(08 Oct 26)

    Ukrainian translation update

  • piratenpanda(08 Oct 26)

    spektrafilm: OpenCL cleanup for wide blurs Two fixes for Gaussian blurs at large sigma, found with --opencl-diffstat (#22533) on a 45 MP export. Evaluate the YVV recursion as an increment, v = w1 + (B*(x - w1) + B2*(w2 - w1) + B3*(w3 - w1)), on both the CPU and the device, using B1 = 1 - B - B2 - B3. In the direct form the DC gain is B / (1 - B1 - B2 - B3), and with B around 2e-6 at sigma 126 the float rounding of the four coefficients swung it with sigma (0.965 at 100, 0.836 at 135, 1.087 at 150). The incremental form has unit gain whatever the coefficients round to, and the large B1/B2 terms no longer cancel every step. Decimate the wide DIR coupler blurs. With the inhibitor spread widened, the correction field is blurred at 50-250 px, where float32 YVV takes in only a few bits of each sample: a one-ulp input difference moves its output by around 1e-3, and the correction enters the log exposure directly, so film and paper contrast turned that into max_abs_diff of 1.3e-2 to 5e-2 between CPU and device. From sigma 16 up the field is now box-averaged down by k = floor(sigma / 8), blurred with the exact kernel at the reduced sigma (at most 48 taps on k^2 fewer pixels) and interpolated back bilinearly, the reduced sigma discounting the variance the box and the interpolation add. The block grid sits on absolute image coordinates so tiles agree. CPU (sf_blur_plane3_wide) and device (spektrafilm_wide_down, gauss_row/ col_4c, spektrafilm_wide_up) run the same operations in the same order, with fma pinned, host-built reciprocals instead of device division, and a CPU loop structure -ffast-math cannot reorder; the CPU path matches a strict transliteration of the kernels bit for bit. Measured with --opencl-diffstat, Portra 400, couplers at maximum: spread before after tail 400 um, weight 1 2.7e-2 1.6e-6 tail 200 um (sigma <= 126) 1.3e-2 1.7e-6 core 60 um at sigma 62 / 99 7.0e-3 / 1.3e-5 / 3.1e-2 3.3e-5 no spread (control) 1.5e-6 1.5e-6 Blurs above SF_GAUSS_EXACT_MAX_SIGMA change slightly, towards the requested Gaussian. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01P44nsSAzW3NY2znvV3yFRf

  • Victor Forsiuk(08 Oct 26)

    en@truecase update

  • piratenpanda(08 Oct 26)

    spektrafilm: finish each pass of a cascaded YVV blur on the device A Gaussian wider than SF_GAUSS_MAX_IIR_SIGMA runs as ceil((sigma/150)^2) Young-van Vliet passes. At diffusion size 4 on a 45 MP export that is about 100 passes per bloom component, all enqueued without a sync, and the runtime submits them as one job. On amdgpu that job outlives the compute ring's lockup timeout: the ring is reset, the context is marked guilty and Rusticl aborts the process. Wait for the device after every pass of a cascade so each submission holds a single row/column pass. Single-pass blurs are unchanged. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01P44nsSAzW3NY2znvV3yFRf

  • Daniele Pighin(04 Oct 26)

    develop: move history compress and truncate out of the history module The history module's compress and truncate buttons ran the whole operation inside libs/history.c. Move it to dt_dev_history_truncate in develop.c, unchanged, so that other darkroom code can compress the history of the image being developed too. The history module now calls it.

  • Daniele Pighin(04 Oct 26)

    masks: cancel the shape being drawn with Escape A shape being added could only be abandoned with a right-click on the canvas. Escape now cancels it too, leaving the module's mask in edit mode, as a right-click does. The check runs ahead of the shortcut lookup, so it wins over a user binding of Escape while a shape is being drawn and leaves that binding alone the rest of the time.

  • Daniele Pighin(04 Oct 26)

    masks: draw shapes on the canvas with a contrasting edge Shape outlines were drawn as a dark line under a lighter one in the guide overlay's color. The dark shade is black at full contrast and vanishes over a dark picture. Draw the line in the overlay color over an edge in white or black, whichever contrasts with that color, so one of the two stays visible whatever lies underneath. A border's dashes are edged one by one, a clone source swaps the two tones so it stays apart from the shape it copies to, and a hovered or selected shape is heavier as well as more opaque. The overlay contrast setting still sets how far the two tones stand apart.

  • Daniele Pighin(04 Oct 26)

    ras2vect: give vectorized path points a nonzero feather An AI object's outline is vectorized into path points with a feather of exactly 0. The feather control scales a path's feather by the ratio of new to old value, and _path_modify_property treats an old value of 0 as "nothing to scale", so such a path could never be feathered at all. Seed the feather with 0.0005, as path.c does for points it creates itself.

  • Daniele Pighin(04 Oct 26)

    develop: do not dereference freed modules in the chroma cache dev->chroma.temperature and dev->chroma.adaptation are raw module pointers, written by temperature.c and channelmixerrgb.c, and only cleared by dt_dev_reset_chroma. That function first calls dt_dev_clear_chroma_troubles, which dereferences both. try_enter resets chroma on every darkroom entry, by which time the modules of the previous image are freed, so opening an image after leaving the darkroom could crash in dt_iop_set_module_trouble_message. dt_iop_cleanup_module now clears a pointer to the module it frees, and dt_dev_clear_chroma_troubles ignores a module that is no longer in dev->iop, since the cache is written from too many places to rely on the first alone.

  • Mayk Thewessen(07 Oct 26)

    tests: Cover HDR input with sRGB gamut clipping The HDR CLI matrix exercised unbound input conversion but not the separate gamut-clipping path. Add independent PQ and HLG cases for Rec2020 and P3, using encoded stimuli with highlights above reference white and near-black samples. Decode the actual PNG samples with the NumPy reference, clip in linear sRGB, and compare the rendered output. Optional OpenCL cases require confirmed GPU execution with no lost events rather than CPU fallback. The HLG clipping checks reject the legacy input decoder. This provides numeric coverage for the HLG behavior behind integration test 0109.

  • Pascal Obry(07 Oct 26)

    Update darktable.pot for translators.

  • piratenpanda(07 Oct 26)

    spektrafilm: default print gamma to 1.0 The reference applies the paper curves at gamma_factor 1.0. Default print_contrast to that, and drop the 1.1 the scene-referred default preset carried, so new images print on the paper as profiled. The params layout is unchanged; existing edits keep their stored value. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01PUcQsmsKTfK2SRKVobpXPs

  • Pascal Obry(07 Oct 26)

    src/tests/integration: Update sub-module.

  • Mayk Thewessen(06 Oct 26)

    color: Simplify HDR transfer branching Skip ICC shaper lookups in the HDR colorin kernels and share the RGB result and return path in the OpenCL transfer helpers. Use explicit branches in the CPU tone-curve helper and clarify the profile switch and multi-line JPEG XL conditions.

  • Mayk Thewessen(05 Oct 26)

    RELEASE_NOTES.md: Document PQ and HLG brightness correction

  • Mayk Thewessen(05 Oct 26)

    color: Fix PQ luminance scaling and HLG display conversion Decode and encode built-in HDR profiles at an RGB boundary with a shared CPU/OpenCL transfer implementation. Use 203 nit reference white for PQ and the RGB-dependent HLG OOTF for the nominal 1000 nit display. Keep the gamut matrix and LittleCMS conversion linear to avoid applying a second transfer. Preserve structured HDR signaling for PNG and JPEG XL imports, and add independent transfer and CLI reference tests. Include the shared header in OpenCL installation and cache invalidation. Fixes #20562

DarkTable Security

5.7/10

Repo Security Summary

Updated 24 Aug 26

  • Dangerous-Workflow10/10
  • Code-Review9/10
  • Maintained10/10
  • Token-Permissions0/10
  • CII-Best-Practices2/10
  • Binary-Artifacts10/10
  • Security-Policy0/10
  • License10/10
  • Packaging10/10
  • Fuzzing0/10
  • Branch-ProtectionN/A
  • Signed-Releases6/10
  • Pinned-Dependencies0/10
  • SAST0/10

DarkTable Website

Website

darktable

darktable is an open source photography workflow application and raw developer

Redirects

Does not redirect

Security Checks

All 65 security checks passed

Server Details

  • IP Address65.108.31.59
  • Hostnametron.pixls.us
  • LocationHelsinki,Uusimaa,Finland,EU
  • ISPHetzner Online GmbH
  • ASNAS24940

Associated Countries

  • FRFR
  • FIFI

Safety Score

Website marked as safe

100%

Trackers

No known trackers found

Blacklist Check

www.darktable.org was found on 0 blacklists

  • AntiSocial Blacklist
  • Artists Against 419
  • Badbitcoin
  • Bambenek Consulting
  • CERT Polska
  • CoinBlockerLists
  • CRDF
  • CryptoScamDB
  • EtherAddressLookup
  • EtherScamDB
  • Fake Website Buster
  • MetaMask EthPhishing
  • NABP Not Recommended Sites
  • OpenPhish
  • PetScams
  • PhishFeed
  • PhishFort
  • Phishing.Database
  • PhishStats
  • PhishTank
  • Phishunt
  • RPiList Not Serious
  • Scam.Directory
  • SecureReload Phishing List
  • Spam404
  • StopGunScams
  • Suspicious Hosting IP
  • ThreatFox
  • ThreatLog
  • TweetFeed
  • URLhaus
  • ViriBack C2 Tracker

Website Preview

Website preview

DarkTable Docker

Container Info

Darktable

[darktable](https://www.darktable.org/) is an open source photography workflow application and raw developer. A virtual lighttable and darkroom for photographers. It manages your digital negatives in a database, lets you view them through a zoomable lighttable and enables you to develop raw images and enhance them.

#Photos

View on DockerHub

linuxserver/darktable:latest

Run Command

docker run -d \
  -p 3000:3000/tcp \
  -p 3001:3001/tcp \
  -e PUID=${PUID} \
  -e PGID=${PGID} \
  -e TZ=${TZ} \
  -v /srv/lsio/darktable/config:/config \
  --restart=unless-stopped \
  linuxserver/darktable:latest

Compose File

version: 3.8
services:
  darktable:
    image: "linuxserver/darktable:latest"
    ports:
      - "3000:3000/tcp"
      - "3001:3001/tcp"
    environment:
      PUID: 1000
      PGID: 1000
      TZ: Etc/UTC
    volumes:
      - "/srv/lsio/darktable/config:/config"
    restart: unless-stopped

Environment Variables

  • Var NameDefault
  • PUID1000
  • PGID1000
  • TZEtc/UTC

Port List

  • 3000:3000/tcp
  • 3001:3001/tcp

Volume Mounting

  • Container PathHost Bind
  • /config/srv/lsio/darktable/config

DarkTable Reviews

More Image Editors

About the Data: DarkTable

Change History

  • Added

Edit DarkTable Data

You can edit DarkTable's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external sources, a list of these can be found data documentation.

Origin Data

Modify Data

API

You can access DarkTable's data programmatically via our API. Simply make a GET request to:

https://api.awesome-privacy.xyz/v1/services/darktable

The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.

Share DarkTable

Help your friends compare Image Editors, and pick privacy-respecting software and services.
Share DarkTable and Awesome Privacy with your network!