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,367,414 KB
  • Stars13,324
  • Forks1,494
  • Watchers13,324

Language Usage

Language Usage

Project Health

  • Last commit5 days ago
  • Open issues647
  • Latest releasev5.4.0-ai

Top Contributors

Recent Commits

  • Pascal Obry(25 Oct 26)

    Merge pull request #22785 from piratenpanda/spektra_reference spektrafilm: Move closer towards the reference implementation

  • piratenpanda(25 Oct 26)

    spektrafilm: add the viewing glare in XYZ ahead of the compressor The reference adds the glare veil as the viewing illuminant in XYZ, right after the scanner black/white fit and before the output matrix, the gamut compression and the scanner blur and unsharp mask (scanning._density_to_rgb, add_glare). The module added it as an RGB offset at the very end, after compression and sharpening, so the veil was neither compressed nor sharpened with the image and could push output past the compressor's bounds. Generate the blurred glare field before the scan and add it inside sf_sim_scan and spektrafilm_scan, scaled by the viewing illuminant's XYZ. sf_glare becomes sf_glare_field, and spektrafilm_glare_add goes.

  • piratenpanda(25 Oct 26)

    spektrafilm: apply a positive scan's black/white exposure after halation The reference multiplies the film raw by black_white_filming_exposure_correction() at the end of filming.expose, after the highlight boost, the diffusion filter and halation. The module folded it into the exposure scale instead, so it acted before the highlight boost, whose threshold and curve are absolute in raw units, and a positive scan with black/white correction and boost on rendered its highlights differently. Carry it as a separate raw_scale applied where the raw goes to log exposure, on the CPU path, the OpenCL kernel and the colour picker probes alike.

  • piratenpanda(25 Oct 26)

    spektrafilm: derive the density curves from the curve model throughout The reference treats a profile's density_curves_model as the source of truth: the pipeline samples it onto the log-exposure grid (refresh_density_curves_from_model) and bakes the film chemistry morph into the result before anything reads the curves. The module instead used the stored, measured curves, which differ from the model by up to 0.005 density on the colour stocks, and used the morphed film curves only for development. - sample the model into density_curves when a profile is loaded - read the morphed film curves for the print balance midgray, the enlarger and scan table ranges and the black/white references, so film gamma, push/pull and developer exhaustion move them as they do in the reference - locate the per-pixel density for the grain sub-layers on the normalized total curve, as interp_density_cmy_layers_channel does - size a single-sublayer grain from the curve peak (_coarsest_area_from_curves) instead of the closed form at net density 1, as apply_grain does for every stock

  • piratenpanda(25 Oct 26)

    spektrafilm: run the OkLCh output compressor on D65-relative XYZ OkLab is defined on D65-relative XYZ, and the reference converts the output RGB to XYZ with the output space's own white before OkLab. The module fed it darktable's D50 PCS XYZ instead, where a neutral sits at an OkLab chroma of about 0.046. With the knee starting at zero chroma and C_max collapsing towards white, neutrals were pulled off gray in the highlights: a Rec.2020 work profile white came out at a blue/red ratio of 0.965. Adapt the output white to D65 with Bradford, which undoes the ICC adaptation exactly, before XYZ -> OkLab, and back after. The C_max table, the CPU path, the OpenCL kernel and the lightness probes all read the same matrices, so they move together.

  • piratenpanda(25 Oct 26)

    spektrafilm: match the reference's fallback filters and coupler gammas A film, paper and enlarger illuminant combination missing from the neutral print filter database kept the C0 M65 Y55 parameter defaults. The reference prints such a combination with C0 M50 Y50 (params_builder._DEFAULT_NEUTRAL_PRINT_FILTERS), so use that. The generic DIR coupler gammas, used only for a stock the pack does not characterise, now carry DirCouplersParams' schema defaults instead of an older set.

  • piratenpanda(25 Oct 26)

    spektrafilm: derive grain seed salt from the capture date and time Salting the grain and glare seeds with the image id gave every duplicate of an image its own grain pattern, and the pattern changed whenever an image was re-imported. Derive the salt from the EXIF capture date and time instead, so an image and all its duplicates share one pattern that is stable across re-imports and machines, while images taken at different times still get different grain.

  • Victor Forsiuk(24 Oct 26)

    "Pre-demosaiced" is incorrect if we meant "already demosaiced"

  • Pascal Obry(25 Oct 26)

    Merge pull request #22775 from victoryforce/better-tethering-warning [GUI] Better warning about unreadiness for tethering

  • Pascal Obry(25 Oct 26)

    Merge pull request #22781 from masterpiga/flexi-raster-overlay masks: give an on-canvas presence to raster elements

  • Pascal Obry(25 Oct 26)

    Merge pull request #22760 from zisoft/capture-time-collection-filter fix capture time based collection filter

  • Pascal Obry(25 Oct 26)

    Merge pull request #22780 from masterpiga/fix-22777 masks: make a typed 0 on a relative property slider reach the minimum

  • Mario Zimmermann(24 Oct 26)

    refactor database routines

  • Daniele Pighin(25 Oct 26)

    RELEASE_NOTES.md: note the raster mask tint on the canvas

  • Daniele Pighin(25 Oct 26)

    masks: tint a raster element's area when its panel row is hovered A raster element has no shape, so with the masks shown on the canvas nothing told the user what area it affects. Hovering its row now tints the area its source's mask covers, read from the preview pipe's copy of that mask and kept for the preview it was built for. The AI objects' tint cache, bilinear read, overlay painting and form lookup are shared with it rather than copied.

  • Daniele Pighin(25 Oct 26)

    masks: start the property slider range at the minimum and explain it After a typed value below the minimum, the slider's range still reached down to that value, because setting a soft bound re-applies the slider's current value and widens the range to include it. The value is now set before the soft range, and a toast names the minimum when a typed value was below it. Related: #22777

  • Daniele Pighin(25 Oct 26)

    masks: make a typed 0 on a relative property slider reach the minimum Typing 0 into the size, hardness, fade-out border or compression slider did nothing, because modify_property reads a zero value as "no ratio" and leaves the shape alone. The edit is now floored to the property's minimum before it is applied, so the shape lands on the lowest value it accepts. Fixes #22777

  • Pascal Obry(24 Oct 26)

    Merge pull request #22770 from masterpiga/fix-22470 masks: fixes path nodes jumping around and refreshes preferences accordingly

  • Daniele Pighin(24 Oct 26)

    RELEASE_NOTES.md: note the masking preferences moving to the masks panel

  • Daniele Pighin(24 Oct 26)

    RELEASE_NOTES.md: note the path mask resize fix

  • Daniele Pighin(24 Oct 26)

    masks: move the masking preferences into the masks panel The shrink or grow settings were only in the preferences dialog, far from the slider they change. A gear beside the slider now opens a popover with the step, the unit, the tracing resolution and the curve smoothing, laid out like the group layout presets. The scroll direction and the mask indicator join the panel's options popover, and the masking section of the preferences dialog goes. A shape cached under old resize settings is no longer reused after they change.

  • Daniele Pighin(24 Oct 26)

    masks: keep path resize faithful and its nodes steady Growing or shrinking a path turned its curves into near-straight chords and picked a new set of nodes at every scroll step, so the nodes jumped around. Each original node now follows the offset outline and the handles are fitted to it, with extra nodes only where a curve needs them. The tracing resolution is capped at two raster pixels per image pixel, which makes small paths much faster. The "balanced" smoothing came out the same as "smooth" with this, so it is dropped. Fixes #22470

  • Daniel Zwell(16 Oct 26)

    The profiled denoise tabs should say "luma" and "chroma" The existing titles, Y0 and U0V0, are not descriptive to most people. Luma and chroma are intelligible and accurate, even to mathematicians. The current Y0 and U0V0 names are kept in the tooltips. Note that the channel is already indicated by the color of the curve, but that's insufficient as a cue to new users.

  • piratenpanda(24 Oct 26)

    spektrafilm: salt grain and glare seeds with the image id The grain and glare random fields were seeded from pixel coordinates and constant channel/sub-layer indices only, so two images of the same size with the same spektrafilm settings (e.g. from a style or preset) got an identical grain pattern. Mix grain_hash(imgid) into grain_pixel_seed so every image gets its own pattern, on both the CPU and OpenCL paths.

  • Victor Forsiuk(23 Oct 26)

    Minor code readability maintenance

  • Victor Forsiuk(23 Oct 26)

    Add more information to the failure message

  • Mario Zimmermann(23 Oct 26)

    add release note for capture time collection filter

  • Mario Zimmermann(23 Oct 26)

    fix capture time based collection filter

  • Pascal Obry(23 Oct 26)

    Merge pull request #22748 from masterpiga/flexi-ui-revamp masks: a more accessible panel

  • Daniele Pighin(23 Oct 26)

    masks: name the parts of the tree element, group and member "Element" meant a leaf in some places and any child of a group in others, so a group's tooltips talked about its "elements" while a nested group was not one. An element is now always a leaf, a group holds other parts, and a member is either, as seen from its group. The member-wide names follow: the row header class, the group members box class, the drop and pack functions, the operator tooltips, the "member properties in subpanel" option and the docs, which now define the three terms in masks_data_model.md.

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!