Luxe
Luxe

A coding agent worth
keeping open.

Luxe is an agentic coding harness in Rust: fast, lean, and careful with your machine. It plans, builds and reviews — and it is pleasant to sit in front of, which turns out to matter when you are there all day.

cargo install luxe-cli

Linux, macOS and Windows. A UTF-8 terminal and nothing else.

What it is

A terminal program that drives a model through real work: reading the tree, editing files, running your tests, and showing you what changed. It talks to about twenty providers, or to a model on your own GPU.

It is not a router, a hosted service, or an IDE. It is the part between you and the model, and the whole design is about keeping that part small, quick, and legible.

A question, a turn, and an answer. The recording is nine kilobytes; the text in it is selectable.

Plan → build → review

An agent that shows its work.

Most harnesses hand you a diff and wish you luck. Luxe chapters a change into sections with an argument attached — what moved, why, and what it relied on — and lets you walk it the way a reviewer reads a pull request rather than the way a machine emits one.

Leave a comment on a line and the agent takes it as work. Planner, developer and reviewer are separate roles with separate models if you want them, and the review gate is a command that has to pass before a turn counts as done.

Guided Review: walking a change section by section, asking why one exists.
Side-by-side with word-level emphasis — the wash locates the change, the strike and the bold say which way it went. Side-by-side with word-level emphasis — the wash locates the change, the strike and the bold say which way it went.
Side-by-side with word-level emphasis — the wash locates the change, the strike and the bold say which way it went.

It respects your machine

Local first, and quiet about it.

No telemetry, no accounts, no phone-home. Exactly three outbound calls exist — your model provider, the web_* tools, and a model-metadata refresh — and every one of them is optional and offline-safe.

Permissive by default, because a harness that blocks real work gets its permissions turned off. But a small set of guardrails is always on: reading .env is denied, catastrophic shell commands are denied, and work outside the project asks first. A project's own config can tighten that; it cannot loosen it.

  • 2,511 tests, all green
  • 22s to build and run the suite for Windows, from Linux
  • 0 unsafe blocks — unsafe_code = "forbid"
  • 3 outbound calls, every one optional

Where it runs

Three platforms, one of them properly.

Windows is the one that breaks silently, so it gets a loop rather than a wish: the whole suite cross-compiles and runs under wine in about twenty seconds, with only MinGit on PATH — a stricter environment than CI's. Its first baseline found thirty-two failures where CI reported fifteen.

Every one of those, read properly, was a defect a Windows user meets in their first session. Malformed file:// URIs. A timeout that orphaned the process tree. A shell lookup that would have found WSL's launcher and run your commands on a different filesystem.

Make it yours

Twelve themes, three glyph tiers, one config file.

Luxe ships its own palette — warm graphite and champagne brass — and eleven more, including the ones you already use. Every accent holds a contrast floor that is asserted in the test suite rather than eyeballed.

Icons are polish, never meaning: every one sits beside the words it labels, so a reader with a bare monospace font loses shine, not information. Extend it with hooks, skills, external commands and MCP servers — data and processes, never in-process plugin code.

Tool cards, tinted by outcome. Tool cards, tinted by outcome.
Tool cards, tinted by outcome.
The Context Dock: what the agent is holding, and what changed. The Context Dock: what the agent is holding, and what changed.
The Context Dock: what the agent is holding, and what changed.

For the model

The other reader.

A tool earns its slot by beating the shell command it replaces on bounded output, fewer round-trips, or correct-by-default behaviour. A wrapper that only renames a shell command is worse than nothing: the model tries it once, gets a worse answer than bash would have given, and stops trusting the set.

What reaches the model is auditable rather than assumed — capture a session with LUXE_WIRE_LOG and read it back with luxe wire. The invariant it guards is that the system prompt stays byte-identical between turns, so the cache prefix holds and you are not paying to re-send it.

Start.

cargo install luxe-cli

Then run luxe in a project. The first launch walks you through signing in.