LuxeA simple, opinionated RAW photo editor, powered by darktable's image-processing engine. |
Luxe is a desktop photo editor built with Godot 4. Instead of reimplementing RAW processing from scratch, it embeds darktable's real pixel pipeline in-process through a small C++ GDExtension, so every slider you drag is processed by the same code darktable's own darkroom uses.
https://github.com/user-attachments/assets/257148fa-0ed2-4830-85a8-caf0972ba8f7
Luxe is a RAW photo editor with a deliberately small surface. You open a file, drag a handful of well-chosen sliders, and export. There is no module browser, no plugin marketplace, and no wall of technical settings: just the adjustments that actually move a photograph.
Under the hood it is darktable. Luxe runs darktable's core library (lib_darktable) inside the same process as the editor and drives its pixel pipeline directly, so the preview you see and the file you export are produced by darktable's genuine processing code, not an approximation. The frontend is Godot, which gives us a fast, GPU-accelerated, cross-platform UI shell.
The result is a small, fast editor with a serious processing engine underneath.
Currently only support M-Series MacOS
The UI also gives you:
v0.1.3 -- Speed up edits by 5x, add advanced sliders, add Crop
v0.1.2 -- Add extra sliders
v0.1.1 -- light/dark theme system and macOS export.
v0.1 -- the first editor shell: open a RAW, drag exposure, watch the preview re-render live.
4.6.beta3).pip install scons).xcode-select --install).Building darktable
Luxe does not vendor darktable; the extension is built against your own darktable checkout. Build a headless configuration of darktable from source (see darktable's build docs) and place the checkout as a source/ directory beside this repo, so the relative paths in project/project.godot resolve.
Building the GDExtension
Clone the branch matching this repo's Godot version and build both targets:
git clone --branch 4.5 --depth 1 https://github.com/godotengine/godot-cpp extension/godot-cpp
cd extension/godot-cpp
scons target=template_debug arch=arm64
Then build the C++ shim itself:
cd extension
scons arch=arm64
scons arch=arm64 target=template_debug
The build writes compiled frameworks into project/bin/, which project/dt_backend.gdextension points at.
Godot knows nothing about RAW processing and darktable knows nothing about Godot, so a GDExtension bridges them: one C++ class, DtBackend, that GDScript can call.
backend.set_exposure(1.5) or backend.export_image("out.jpg").DtBackend translates each call into the actual darktable C API calls that darktable-cli uses internally.flowchart LR
UI["GDScript UI"] --> BE["DtBackend<br/>(C++ GDExtension)"]
BE --> DT["darktable core<br/>(headless)"]
DT --> UI
The internals of the bridge are not documented here; read the source if you're curious. It is single-session (one image open at a time) and keeps the UI responsive while the pipeline runs.
Contributions are welcome. See CONTRIBUTING.md for the full guide. The short version:
scripts/smoke_test.sh to confirm the pipeline works end to end.scripts/install-hooks.sh (the pre-commit hook rebuilds the GDExtension when its sources change and aborts the commit on a build failure).Luxe is free software, released under the GNU General Public License, version 3 or (at your option) any later version (GPL-3.0-or-later). See LICENSE for the full text.
NOTICE).Because Luxe links against GPLv3 darktable, the combined work is distributed under the GPL. By contributing, you agree to license your contributions under GPL-3.0-or-later.
LuxeA simple, opinionated RAW photo editor, powered by darktable's image-processing engine. |
Luxe is a desktop photo editor built with Godot 4. Instead of reimplementing RAW processing from scratch, it embeds darktable's real pixel pipeline in-process through a small C++ GDExtension, so every slider you drag is processed by the same code darktable's own darkroom uses.
https://github.com/user-attachments/assets/257148fa-0ed2-4830-85a8-caf0972ba8f7
Luxe is a RAW photo editor with a deliberately small surface. You open a file, drag a handful of well-chosen sliders, and export. There is no module browser, no plugin marketplace, and no wall of technical settings: just the adjustments that actually move a photograph.
Under the hood it is darktable. Luxe runs darktable's core library (lib_darktable) inside the same process as the editor and drives its pixel pipeline directly, so the preview you see and the file you export are produced by darktable's genuine processing code, not an approximation. The frontend is Godot, which gives us a fast, GPU-accelerated, cross-platform UI shell.
The result is a small, fast editor with a serious processing engine underneath.
Currently only support M-Series MacOS
The UI also gives you:
v0.1.3 -- Speed up edits by 5x, add advanced sliders, add Crop
v0.1.2 -- Add extra sliders
v0.1.1 -- light/dark theme system and macOS export.
v0.1 -- the first editor shell: open a RAW, drag exposure, watch the preview re-render live.
4.6.beta3).pip install scons).xcode-select --install).Building darktable
Luxe does not vendor darktable; the extension is built against your own darktable checkout. Build a headless configuration of darktable from source (see darktable's build docs) and place the checkout as a source/ directory beside this repo, so the relative paths in project/project.godot resolve.
Building the GDExtension
Clone the branch matching this repo's Godot version and build both targets:
git clone --branch 4.5 --depth 1 https://github.com/godotengine/godot-cpp extension/godot-cpp
cd extension/godot-cpp
scons target=template_debug arch=arm64
Then build the C++ shim itself:
cd extension
scons arch=arm64
scons arch=arm64 target=template_debug
The build writes compiled frameworks into project/bin/, which project/dt_backend.gdextension points at.
Godot knows nothing about RAW processing and darktable knows nothing about Godot, so a GDExtension bridges them: one C++ class, DtBackend, that GDScript can call.
backend.set_exposure(1.5) or backend.export_image("out.jpg").DtBackend translates each call into the actual darktable C API calls that darktable-cli uses internally.flowchart LR
UI["GDScript UI"] --> BE["DtBackend<br/>(C++ GDExtension)"]
BE --> DT["darktable core<br/>(headless)"]
DT --> UI
The internals of the bridge are not documented here; read the source if you're curious. It is single-session (one image open at a time) and keeps the UI responsive while the pipeline runs.
Contributions are welcome. See CONTRIBUTING.md for the full guide. The short version:
scripts/smoke_test.sh to confirm the pipeline works end to end.scripts/install-hooks.sh (the pre-commit hook rebuilds the GDExtension when its sources change and aborts the commit on a build failure).Luxe is free software, released under the GNU General Public License, version 3 or (at your option) any later version (GPL-3.0-or-later). See LICENSE for the full text.
NOTICE).Because Luxe links against GPLv3 darktable, the combined work is distributed under the GPL. By contributing, you agree to license your contributions under GPL-3.0-or-later.