Kelvin

Developing the shootis the slow part.

Kelvin reads a photograph — the scene, the light, what has technically gone wrong — and builds four complete edits from what it finds. Pick the one closest to what you had in mind and carry it across the rest of the folder.

It all runs on your Mac. There is no account and nothing is uploaded.

1.5 GB, model included · macOS 14+ · Apple Silicon · free, AGPL-3.0-only

One photograph of a car on a forest road, rendered four ways by Kelvin: Natural, Soft, Vivid and Dramatic.
One frame from a Sony A7R IV, with the four edits Kelvin produced for it. These are not one look at four strengths. Each is worked out separately from this frame’s histogram and EXIF, which is why the white balance is different in each.
Candidates4

Close to what the meter gave you, cleaned up.

How it decides

Where the numbers actually come from

What the model is asked
landscapegolden hourobject

“Sunlight from the front creates a strong golden-hour glow with high contrast.”

That is the entire output: a few categories and a sentence of description, from a small vision model looking at a 768-pixel copy of the photograph. There are no numbers in it anywhere.

What the code works out
Temp
7,740 K
Tint
+2
Exposure
0.00 EV
Contrast
+10
Highlight recovery
−1
Whites
+16
Blacks
−7

These come from ordinary code reading the histogram and the EXIF. Run it twice on the same file and you get the same numbers — they are arithmetic, not a guess, and arithmetic can be checked.

Ask a two-billion-parameter model for an exposure and it will give you one — exposure: +0.37, delivered with the same confidence whether it is right or wrong, and afterwards no way to tell which it was. So Kelvin never asks the model for a number. It asks what a vision model can genuinely answer — backlit portrait, or landscape at dusk — and the exposure is then calculated from the histogram, the way any other photo software would calculate it.

The same rule holds for what is wrong with a photograph. Kelvin does not take the model’s word that the shadows are crushed or the sky is blown; it measures the histogram and finds out. When those two were checked against each other over seventy-seven real edits, they were not describing the same photographs — so the engine stopped asking. Fewer photographs come out worse than if it had done nothing at all.

The four candidates are survivors, not the whole field. The engine renders more styles than it shows, scores each against its own craft checks, and drops any with a real defect — a Dramatic that crushes a backlit frame into silhouette never reaches the menu.

Choosing

Big enough to actually choose between

A professional can read +18 contrast off a list and picture the result. Everyone else needs to see it. So press C and the candidates take over the window — two side by side, or all four when you want the survey.

Two up is the default, because a comparison is a question, and this one or that one is a question anybody can answer. Zoom and pan apply to every tile at once, so you are never comparing two different parts of the frame, and what you are looking at is a real render rather than an enlarged thumbnail — a comparison of anything other than what you would actually get is worse than no comparison.

Masks

It finds the subject on its own

A subject mask in Kelvin, isolating the car from the forest road behind it, with its editor open on the right.

Kelvin picks out the subject and edits only that, leaving the rest of the frame alone. Invert the mask and the edit swaps sides: the background changes and the subject stays exactly as it was. A mask can be narrowed by colour or by light.

Detection finds whatever stands out most and then stops — it finds the car above, not the one tree behind it you wanted darker. So you can point at the thing you want instead, and the selection spreads from there until the picture stops matching. What gets stored is that point and a tolerance, never a bitmap, so the selection you approve on screen is the one that reaches a full-size export.

Where the thing you pointed at touches something else the same colour, the selection walks straight into it. Kelvin says so when that happens, and the brush is the way out: it adds and erases, so the spill comes back off by hand.

None of this is generative. There is no inpainting, no object removal and no sky replacement, and none of it is planned. Kelvin changes how a frame is developed, not what was in front of the lens.

The one exception is small and worth stating plainly: click a speck of sensor dust and Kelvin patches it, choosing a clean piece of the same photograph to cover it with. Nothing is invented and nothing is fetched — it is a few pixels moved a short distance, stored as a position rather than as pixels, so one click travels to the rest of the shoot and to the full-size export.

The shoot

Applying it to the rest of the folder

Settle on a look for one frame and batch apply carries it across the others. The filmstrip groups the folder into the days the photographs were taken, counts the frames in each, and filters to keepers, undecided or edited when you want to work through one slice at a time.

It also flags problems before you go hunting for them. A frame with a strong colour cast says so, with a Fix button next to the warning.

Kelvin's filmstrip grouped into capture days — Sunday 23 July 2023, 3 frames; Saturday 29 July 2023, 1 frame — beneath the main image and its adjustment panel.
The strip along the bottom is the whole folder, split into the days the photographs were taken. The subject mask from the previous section is still on the car.
Walkthrough

Watch it work

Silent · 29 seconds · 1432×880

Privacy

It works with the Wi-Fi off

A released build carries the model inside it, so the reading happens on your Mac and there is no upload step to wait for. If your library lives in iCloud it still lives in iCloud — Kelvin changes nothing about that, in either direction.

Specifications
Opens
RAW · JPEG · HEIC · PNG · TIFF
Exports
JPEG · HEIC · PNG · 16-bit TIFF
Colour spaces
sRGB · Display P3 · Adobe RGB
Export size
Full, or a long edge you choose
Tests
783 — 562 core, 221 app
CI
Runs on every pull request
Licence
AGPL-3.0-only, with a CLA
Requires
macOS 14 or later · Apple Silicon
Where this stands

Shipped. Not finished.

Kelvin 0.8.2is real, and it is early. Everything above is the app running on real photographs from a Sony A7R IV, not a mockup — download it, point it at a folder, and check this page against what happens. A leading zero is an honest number: there will be rough edges, and the repository’s issue tracker is where they get fixed.

The source is public under AGPL-3.0-only — the repository is on GitHub, tests and licence and all. New releases land here and in the app’s own update check, which is on by default while Kelvin is this young — two switches in Settings turn it off, and the privacy page says exactly what it sends.

Kelvin-0.8.2.dmg · 1.5 GB, because the model ships inside the app · macOS 14+ · Apple Silicon