Skip to content

Luxforge · work printsapa.jpg, in six layers

A fast, free photo editor you can take apart.

The original photograph: rice terraces near Sapa, Vietnam, seen from the air, with a white road winding across them.0Original · catalog.import
1Basic · edit.set-basic
2Basic · Mask · edit.set-basic
3Colour mixer · edit.set-mixer
4Presence · edit.set-presence
5Presence · Mask · edit.set-presence
6Vignette · edit.set-vignette
The finished print, as Luxforge exported it with all six layers.

The finished print, as Luxforge exported it.

Luxforge is open source, written in Rust, for macOS, Windows and Linux. It is a high-performance, non-destructive editor driven by an API: every slider, brush and crop is a request, and scripts and AI agents can send the same ones.

Proof: the print with all six layers.
Proof · all six layers

The recipe · six layers

Work print, not for release. v0, with no download yet: build it from source. Verified on macOS first; Linux builds in CI; Windows comes later.

Plate I. The Luxforge Develop workspace: history on the left with Original, Basic (5 fields), Presence (2 fields) and Vignette amount -10, the terraces photograph in the centre, the histogram and Basic sliders on the right, and a status bar.

Plate I The editor today

  1. 1Every edit is kept in the history, so you can step back to any point or save it as a named version.
  2. 2Familiar Develop controls for white balance, tone and colour, with a live histogram and clipping warnings.
  3. 3The status bar says what just happened, and whether you’re seeing the quick preview or the exact render.

SpeedHow it keeps up

High-performance editing, accurate to the pixel.

Luxforge is written in Rust and renders each change in two steps: a quick preview sized to the screen, then a cancellable exact render. An exact render that a newer change makes stale is cancelled, not finished.

Your drag Quick preview Exact render let go pause exact render on screen 1 2 3 Your dragQuick previewExact render let go 1 2 3
  1. 1Each change asks for a quick preview sized to the screen, so the picture follows your hand.
  2. 2Pause, and an exact render starts. Move again, and it is cancelled before it finishes.
  3. 3Stop, and the exact render follows. The status bar says which one is on screen.

One measurement, with its scope

From Plate I: Approximate render · 296 ms, the renderer’s own time for the picture on screen. A 1440 × 1800 JPEG at Fit, with Presence on, on an M4 MacBook Pro.

Its own meters

Memory, CPU and GPU, live, in the editor’s Performance section. Any client can read the same numbers with resources.read.

The printer’s logPeople and programs, one history

One history for you and your scripts.

Every change is an entry with its author’s name: you in the editor, agent · my-script from a program. Both land in the same history, and if a script’s edit arrives while you are dragging, your draft is kept.

The editor’s own words, when a script commits mid-drag.
Plate II. Luxforge in Mask mode: a radial gradient over the terraces with a green coverage overlay, a draft bar with the radial's size, angle and feather, and a 13-entry history.

Plate II Mask mode

  1. 1The draft bar, 0.180 × 0.240 · −12° · feather 50: the same radial mask as plates 2 and 5.
  2. 2History at rev 13, every entry attributed to its author.
History of sapa.jpg, newest first
EntryHistory labelWhoRequest
5Restore entry 3youyou
4Exposure +0.50 EVagent · my-scriptagent · my-script
3Vignette amount -10youyou
2Presence (2 fields)youyou
1Basic (5 fields)youyou
0Original 

Restore copies entry 3 into a new entry 5; entry 4 stays, and undo from 5 returns to it. † Illustrative; entries 0 to 3 are Plate I’s.

Entry 4 · the request

    A detail of the original photograph: the white road winding through the terraces, crossed by the lower edge of a pale-blue radial mask.

    State of the printWhat works, what’s next

    Where Luxforge stands

    Fixed.Works today

    • Non-destructive editingLayers, history, undo, restore and named versions. Nothing is deleted.
    • RAWNikon Z6, Fujifilm X100VI and DJI Air 2S files, developed from sensor data.
    • BasicWhite balance, exposure, tone and colour, each checked against an independent reference.
    • Tone and colourA tone curve, Presence, an eight-range colour mixer and a vignette.
    • Local masksGradients, brushes, luminance and colour ranges.
    • GeometryCrop and straighten; rotate, mirror and flip with exact integer transforms.
    • PresetsIncluding Lightroom Classic import.
    • ExportAn exact JPEG of the saved edit, from JPEG or RAW originals.
    • ProgrammableCopy as JSON request on every control; luxforge-json for scripts.

    In the developer.Being built next

    • RAW qualification107 models and 126 recording modes catalogued; qualification under way.
    • MCP adapterSo agents can use the same operations.
    • LibraryA multi-photo library, and relinking originals that have moved.

    Latent.Proposed, not built

    • Clone and HealProposals only.
    • AI RemoveA proposal, not yet decided.

    Make your own printBuild it from source

    Make your own print.

    There is no download yet. You’ll need Rust (the toolchain is pinned) and the platform prerequisites in the development guide.

    1. git clone https://github.com/Willyham/luxforge.git
    2. cd luxforge
    3. cargo xtask develop --open fixtures/s0/orientation-6.jpg

    That builds an optimized editor and opens a sample photo. Point --open at any JPEG or supported RAW of your own.

    Or from a script

    cargo build --release -p luxforge-cli builds luxforge-json alone. Send it one request per line, starting with: