Luxe

Configuration

Where Luxe's files live, what a project can set, and every key in config.json.

View as Markdown

Luxe works with no configuration. Everything here is optional, and most of it can be set from inside Luxe: Configuration (on the start screen, or /config) signs you in and opens these files in your editor, /settings changes the settings you use most, /theme sets the theme, and /model the model.

Files

Your own files live in ~/.config/luxe/ (%APPDATA%\luxe on Windows). A project can have its own in .luxe/ at its root.

FileHoldsIn a project
config.jsonAppearance, behavior, and the settings on this page.luxe/config.json, over yours
keybindings.jsonYour keys; see Commands and keys.luxe/keybindings.json, over yours
models.jsonModel and provider settings; see Custom providers
auth.jsonCredentials; see Models and providers
permissions.jsonWhat the agent may do; see Security.luxe/permissions.json, which can only tighten yours
hooks.jsonCommands run at points in a turn; see Hooks.luxe/hooks.json, only with --trust-project
mcp.jsonMCP servers; see MCP.luxe/mcp.json or .mcp.json
lsp-servers.jsonLanguage servers; see Tools
debug-adapters.jsonDebug adapters; see Tools
agents.mdInstructions for every project; see Project contextAGENTS.md
themes/Your own themes; see Appearance
skills/Your own skills; see Skills.luxe/skills/ or .agents/skills/

LUXE_CONFIG_DIR moves the whole directory, and every file in it.

What a project cannot change

A project’s .luxe/config.json overrides yours key by key, with a few exceptions. These run programs, reach the network, or decide what a repository is trusted with, so Luxe reads them from your own config only:

  • launchers and mentions, which run programs
  • update, and github.refresh_secs
  • lsp.project_servers
  • agent.on_ask, which a project can set to deny but not to allow
  • agent.cache_warming, which a project can turn down but not up, since it spends your money

Project gate.commands also run programs. Luxe ignores them and warns unless you start with --trust-project. With trust, a nonempty project list replaces your global list. Otherwise, the loop uses your global commands. Move the list to your own config if you don’t want to trust the project.

Editing

luxe init asks the first run’s questions again (a theme, a provider, the tools, and the start screen) and writes the answers to config.json, changing only those keys. It also writes a config.schema.json beside it so your editor can complete and check every key. --defaults writes a file that chooses nothing, without asking, and so does a run with no terminal; with a config.json already there, either one needs --force, which removes the old file first. Luxe ignores a key it does not know, so an old config always loads on a newer Luxe; check the spelling if a setting seems to do nothing.

/reload (ctrl+shift+r) applies changes to config.json and keybindings.json without restarting.

Settings

luxe. 󰒓 Settings TOOLS ~/.config/luxe/config.json 󰌵 Appearance 1 󰆁 Conversation 2 read · write · edit · bash always on Dock & statusline 3 󰖷 Tools 4 CODE 󱌣 Agent 5 ❯ ast_grep Search and replace by code structure ● on default debug Step through code with a debugger ○ off project glob Find files by name ● on default grep Search file contents ● on default impact What else a change affects ● on default lsp_diagnostics Errors and warnings from a language … ● on default lsp_navigation Definitions, references and types ● on default module_report Outline a file's symbols ● on default read_symbol Read one function or type ● on default symbol_search Find symbols by name ● on default test Run the tests and read the failures ● on default WEB web_fetch Read a page or a repository ● on default web_search Search the web ● on default WORKFLOW git Status, diffs, commits and pull requ… ● on default mcp Call tools on your MCP servers ● on default ast_grep tools.disabled · Takes effect the next time Luxe starts · the default Matches syntax rather than text, so a rename or a pattern change touches the code and not the comments or strings that look like it. Registers only where there is the ast-grep program. space change · ←/→ step · r reset · e open the file · / search · tab pages · esc back
The Tools page of the settings

/settings, or Settings in Configuration, shows the settings you are most likely to change as controls, on five pages: Appearance, Conversation, Dock & statusline, Tools, and Agent. Each change writes one key to your config.json and leaves the rest of the file as it was.

ToKey
Choose a setting↑ / ↓
Turn it on or off, or step to the next choicespace, enter or →
Step back a choice←
Remove it from your file, so the default appliesr
Open config.json in your editore
Search every page/
Change pagetab, or 1 to 5

Each value says where it comes from: default, global (your config.json), or project (this project’s .luxe/config.json, which wins over yours, so it is changed there). Most settings take effect at once; the rest say they take effect the next time Luxe starts. That includes the Tools page, because the tools the agent is offered are fixed for a run. In a window too small for the panel, it says so instead, and only esc works until the window fits.

Behavior

Notifications

~/.config/luxe/config.json
{ "notifications": true, "bell": false }

notifications sends a desktop notification while the terminal is in the background, when a turn finishes or fails, a tool call waits for your approval, the agent asks you a question, or a Guided Review finishes writing its guide. To pick some of those, list them:

~/.config/luxe/config.json
{ "notifications": ["permission", "question"] }
NameWhen
turnA turn finished or failed
permissionA tool call is waiting for your approval
questionThe agent asked you something
reviewA Guided Review finished writing its guide

bell rings the terminal bell at each of those moments. Both are off by default. Many terminals turn a bell into a request for the window manager’s attention, which can pull focus from what you are doing.

The notification goes through your terminal, as an escape sequence it turns into a desktop notification, so it works over ssh and needs nothing installed. Ghostty, iTerm2, kitty, WezTerm, Warp and foot show them; Luxe recognizes those and sends nothing to a terminal it does not know. If yours shows them and Luxe does not recognize it, name the sequence: "notification_method": "osc9" (the common one) or "osc777". Inside tmux, add set -g allow-passthrough on to your tmux configuration. Your terminal may also have to be allowed to send notifications in your system’s settings.

herdr

Inside a herdr pane, Luxe tells herdr whether it is working, idle, or waiting on you, and why: Approve bash, or the question it asked. herdr shows that in its sidebar, raises its own notification when Luxe finishes or needs you (set in herdr’s [ui.toast]), and reports it to herdr agent wait. After a herdr restart, the pane reopens the same session with luxe --resume. Luxe sends no escape-sequence notifications inside herdr, because herdr keeps them for itself.

Recipes has a Luxe palette for herdr’s theme.

This is local to your machine and on by default. Outside herdr nothing is sent. LUXE_HERDR=0 in the environment stops the reports, and so does the config:

~/.config/luxe/config.json
{ "herdr": false }

Update notice

Once a day, Luxe checks whether a newer release exists and says so on the start screen, with the command to update. Luxe never updates itself. The check sends nothing about you or your machine; the comparison happens locally.

~/.config/luxe/config.json
{ "update": { "check": false } }

LUXE_UPDATE_CHECK=0 turns it off as well.

Launchers

A launcher gives a key to a program that takes over the terminal and gives it back, such as gh-dash or lazygit:

~/.config/luxe/config.json
{
  "launchers": [
    { "key": "alt+g", "command": "gh-dash" },
    { "key": "ctrl+alt+l", "command": "lazygit" }
  ]
}

Luxe keeps running underneath and redraws when the program exits. Text the program writes to the file named by $LUXE_HANDOFF is put in the composer, so a gh-dash command can send #123 look at this to Luxe. A launcher’s key wins over any other binding.

Reference

Every key in config.json, with its default.

KeyDefaultDoes
themeyour Omarchy theme, else luxeThe theme; see Appearance
colorsSingle color overrides; see Appearance
glyphsautoWhich icons to draw; see Appearance
imagesautoHow images are drawn; see Appearance
mousetrueCapture the mouse; see The interface
dashboardtrueOpen on the start screen. false skips it; { "style": "minimal" } shows the prompt alone.
banner_animationtrueThe shine across the start screen’s logotype
show_key_hintstrueThe key hint beside messages waiting for a turn
notificationsfalseDesktop notifications: true, or a list of moments; see Notifications
notification_methodautoauto, osc9 or osc777
bellfalseTerminal bell when a turn ends or something waits on you
herdrtrueReport the agent’s state to herdr; see herdr
statusline.visibilityautoauto, shown or hidden; see Appearance
statusline.styleslabslab or flat
statusline.left["project", "branch", "pr", "todo", "changes"]Modules on the left
statusline.right["context", "cost", "tokens", "thinking", "model"]Modules on the right
statusline.thinking_colorsfalseColor the thinking level
dock.modeautoauto, shown or hidden; see The interface
dock.positionleftleft or right
conversation.alignmentfullfull, left or center; see Appearance
conversation.prose_max_width120Text width under left or center
conversation.wide_block_max_width140Code and table width under left or center
conversation.growthbottombottom or top
conversation.thinkingshownshown, collapsed or hidden
conversation.tool_runsfoldfold or cards
conversation.tool_detailserrorserrors, all or collapsed
conversation.stream_revealsmoothsmooth or off
conversation.activity_barbarsbars, dots or off
conversation.scroll_lines3Lines per wheel notch, 1 to 20
conversation.image_max_rows24Tallest image, in rows
diff.layoutautoauto, split or unified; see Appearance
diff.word_wrapfalseWrap long lines in Guided Review
review.exclude[]Files every review leaves out; see Guided Review
review.context_files[]Extra files a review reads for what the change was for, beside PLAN.md and AGENTS.md
tools.disabled[]Tools to turn off; see Tools
tools.format_on_savetrueFormat each file the agent changes; see Tools
tools.clone_repositoriestrueClone a GitHub repository web_fetch is given; see Tools
lsp.project_serversautoauto, always or never; see Tools
compaction.autotrueSummarize when the window fills; see Sessions and context
compaction.at0.9How full before summarizing
compaction.keep_recent20000Tokens kept word for word
compaction.reserve20000Tokens held back for the reply
compaction.prunetrueReplace old tool output first
compaction.summarizerthe session’s modelThe model that writes the summary
agent.default_modebuildThe mode a session starts in: build or plan; see Plan, then build
plan.files["PLAN.md"]Files or globs plan mode may write; the first plain file gets the plan, or a file matching the first glob
plan.modelthe session’s modelPlan mode’s model, as provider/id; switching to it re-reads the conversation at full price
plan.thinkingthe session’sPlan mode’s thinking level
reviewer.modelthe session’s modelThe model /review and the loop’s gate ask; see A second opinion
reviewer.thinkingthe session’sThe reviewer’s thinking level
reviewer.toolsread-only toolsTools a review may call; whatever you list, a review changes nothing
agent.remember_modeltrueStart on the model you last chose
agent.max_tool_iterationsnoneMost rounds of tool calls in one turn
agent.on_askallowWhat a permission prompt becomes with nobody to answer; see Autonomous runs
agent.cache_warmingstreamingoff, streaming or idle; see Keeping the cache warm
gate.commands[]Commands a phase must pass; see Autonomous runs
gate.timeout_secs600Longest one gate command may run
gate.reviewon when reviewer.model is setHave a reviewer read each phase after the commands pass
worktree.alwaysfalseGive every session a worktree; see Git and GitHub
github.refresh_secs60Seconds between pull request checks; see Git and GitHub
github.sectionsWhat /github lists
update.checktrueLook for a newer release
launchers[]Keys that open other programs; see Launchers
mentions[]Your own @ sources; see Mention sources