Command line × Agents

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

Install

One command with Homebrew.

Requires an Apple Silicon Mac with macOS 14 (Sonoma) or later. Update with brew upgrade anylut.

brew install hisea/anylut/anylut

Homebrew 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 anylut
Agents

Teach 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.

AgentInstall
Claude Codeclaude plugin marketplace add hisea/anylut-cli
claude plugin install anylut@anylut
Codexcodex plugin marketplace add hisea/anylut-cli
codex plugin add anylut@anylut
pipi install git:github.com/hisea/anylut-cli
ompomp plugin marketplace add hisea/anylut-cli
omp plugin install anylut@anylut
opencode

Copy the skill folder:

git clone https://github.com/hisea/anylut-cli /tmp/anylut-cli
mkdir -p ~/.config/opencode/skills
cp -R /tmp/anylut-cli/skills/anylut ~/.config/opencode/skills/

Any other agent that reads SKILL.md can use the folder skills/anylut/ from the repository.

MCP

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).

ClientSetup
Claude Desktop

Add to claude_desktop_config.json:

{"mcpServers":{"anylut":{"command":"/opt/homebrew/bin/anylut","args":["mcp"]}}}
Claude Codeclaude mcp add anylut -- anylut mcp
Cherry StudioSettings, 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.

Quick start

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 } ] }
Guarantees

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 stable code.
Exit codes
0 ok · 2 usage · 3 unsupported file · 4 validation · 5 decode · 6 render · 7 write.
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.