AnyLUT for the command line.
anylut edits photos without changing the original. It reads RAW, JPEG, or HEIC, applies a small, lossless recipe file, and renders a preview or a final JPEG or PNG. It is built for local agents and scripts, and it runs entirely on your Mac.
Apple Silicon · macOS 14+ · Signed and notarized
One command with Homebrew.
Requires an Apple Silicon Mac with macOS 14 (Sonoma) or later. Update with brew upgrade anylut.
brew install hisea/anylut/anylutHomebrew asks you to trust non-official taps. The command above names the formula in full, which trusts only that one formula. To install by the short name, trust it first:
brew tap hisea/anylut
brew trust --formula hisea/anylut/anylut
brew install anylutTeach your agent to use it.
The skill anylut tells the agent to run anylut guide, so the instructions always match the installed version. Install the tool first.
| Agent | Install |
|---|---|
| Claude Code | claude plugin marketplace add hisea/anylut-cliclaude plugin install anylut@anylut |
| Codex | codex plugin marketplace add hisea/anylut-clicodex plugin add anylut@anylut |
| pi | pi install git:github.com/hisea/anylut-cli |
| omp | omp plugin marketplace add hisea/anylut-cliomp plugin install anylut@anylut |
| opencode | Copy the skill folder: |
Any other agent that reads SKILL.md can use the folder skills/anylut/ from the repository.
Or run it as an MCP server.
anylut mcp offers the same commands as tools over stdio. A preview comes back as an image, so the model can look at every edit. Tools need absolute file paths. Apps that you start from the Dock do not see your shell PATH, so use the full path of the tool (/opt/homebrew/bin/anylut).
| Client | Setup |
|---|---|
| Claude Desktop | Add to |
| Claude Code | claude mcp add anylut -- anylut mcp |
| Cherry Studio | Settings, MCP Servers, Add. Type STDIO. Command /opt/homebrew/bin/anylut. Arguments mcp. |
| Codex (GPT) | codex mcp add anylut -- anylut mcp |
ChatGPT (web and desktop) connects only to remote MCP servers over HTTPS. It cannot start a local program, so use Codex for GPT models.
Six commands from photo to file.
A patch is a small JSON file. Use --patch-file - to read it from stdin. set gives an absolute value. add is relative to the current value. A value out of range is an error, and the tool never clamps it.
anylut capabilities --json # every parameter you can write, with ranges
anylut inspect IMG.ARW --json
anylut recipe new --source IMG.ARW --output edit.anylut.json
anylut patch edit.anylut.json --patch-file adjust.json --output edit-v1.anylut.json --json
anylut render IMG.ARW --recipe edit-v1.anylut.json --preview --output preview.jpg --json
anylut render IMG.ARW --recipe edit-v1.anylut.json --full-resolution --output final.jpg --json{ "patchVersion": 1, "operations": [
{ "op": "set", "path": "light.exposure", "value": 0.35 },
{ "op": "add", "path": "color.temperature", "value": 6 },
{ "op": "set", "path": "hsl.orange.saturation", "value": -5 } ] }Built for tools that read the output.
- JSON output
- With
--json, every command prints one JSON object on one line. An error is one{"ok":false,"error":{…}}object with a stablecode. - Exit codes
0ok ·2usage ·3unsupported file ·4validation ·5decode ·6render ·7write.- Safe writes
- Output files are written atomically. An existing file is never replaced unless you pass
--overwrite. - Strict input
- Unknown, missing, or duplicate keys and out-of-range values are rejected, not repaired.
- Local only
- Rendering runs on your Mac. Nothing is uploaded.
- Limits
- A recipe with crop, rotation, flip, or straighten is refused, not rendered without it. RAW support follows your macOS RAW decoder.