Luxe

Appearance

Themes, the statusline, icons and fonts, the conversation's layout, diffs and images.

View as Markdown

Every setting on this page goes in ~/.config/luxe/config.json, or a project’s .luxe/config.json. /reload applies a change without restarting, except to images.

Themes

/theme previews each theme as you move through the list. enter keeps one and saves it to your config; esc puts back the theme you had.

Luxe’s own theme is luxe, a warm graphite with a brass accent. Every accent clears a 4.5:1 contrast ratio against the background, and body text 7:1. The others are dark versions of community favorites and of Omarchy’s themes:

Luxeluxe
Editorsjetbrains (Darcula), vscode (Visual Studio 2017 Dark), xcode (Default Dark)
Communityaura, ayu, catppuccin, dracula, everforest, github (Dark Dimmed), gruvbox, kanagawa, monokai, noctis-bordo, nord, one-dark, panda, rose-pine, tokyo-night, vesper, zenburn
Omarchyethereal, hackerman, last-horizon, lumon, matte-black, miasma, osaka-jade, retro-82, ristretto, solitude, vantablack
~/.config/luxe/config.json
{ "theme": "nord" }

An unknown name falls back to luxe, and Luxe says so when the session opens. See them all at luxe.dev/themes.

Code is colored by the theme too: in answers, tool cards, diffs and the preview, keywords take the theme’s accentSecondary, strings its success, numbers its warning, functions its accent, types its info, and comments and punctuation its muted. Markdown wears the colors it does in an answer. A theme of your own, or your Omarchy theme, colors code with no extra setup, and the website’s code blocks are colored the same way.

Change a few colors

colors overrides single colors on top of any theme. A value is #rrggbb, an ANSI color number (0 to 255), or "" for the terminal’s own default.

~/.config/luxe/config.json
{
  "colors": {
    "accent": "#7aa2f7",
    "diffAddBg": "#12331f",
    "diffDelBg": "#3a1620"
  }
}

The names are the ones a theme file uses; luxe.json lists every one.

One more name is optional: modePlan, the color plan mode wears on the composer and the menus and questions around it. Without it, Luxe picks the first of the theme’s other colors that reads as different from its accent.

Make a theme

A theme is a JSON file in ~/.config/luxe/themes/, named for the file: themes/harbor.json is "theme": "harbor", and it appears in /theme with the built-ins. Its colors need only what it changes; everything else comes from luxe. vars names colors for the rest of the file to use.

~/.config/luxe/themes/harbor.json
{
  "vars": { "harbor": "#2f7d8c" },
  "colors": { "accent": "harbor", "borderAccent": "harbor" }
}

This is also how to have a light theme. Start from a copy of luxe.json for a complete one.

On Omarchy

Leave theme unset, or set it to omarchy, and Luxe wears your desktop’s theme and changes with it, within a couple of seconds, in a running session. It uses, in order:

  1. A luxe.json in the current Omarchy theme. To give every theme one, write a template at ~/.config/omarchy/themed/luxe.json.tpl and Omarchy renders it from each theme’s colors.
  2. Luxe’s built-in theme of the same name, when both are dark.
  3. A theme made on the spot from the Omarchy theme’s colors.toml, with text lifted until it is readable. This is how a light Omarchy theme comes out.

A theme you choose with /theme stays, whatever the desktop does, unless you choose omarchy. /theme saves to your own config, so a theme a project’s .luxe/config.json sets still wins in that project.

Statusline

The statusline is the bar under the composer. Its modules are listed in the order they are drawn: the left half from the edge inward, the right half from the middle outward.

~/.config/luxe/config.json
{
  "statusline": {
    "visibility": "auto",
    "style": "slab",
    "left": ["project", "branch", "pr", "todo", "changes"],
    "right": ["context", "cost", "tokens", "thinking", "model"],
    "thinking_colors": false
  }
}

Those are the defaults. Reorder a list to move modules, and leave one out to hide it. project, branch, pr, todo, changes, cwd and activity belong on the left, the rest on the right, and a module listed on the other side is not drawn. While auto-approve is on, an auto-approve badge sits on the right whatever the list says.

ModuleShows
projectThe project’s name
branchThe Git branch, with * when there are uncommitted changes
prThe branch’s pull request: #138 · 1 failing · 2 threads. Shown only when there is one.
todoThe agent’s checklist: 4/9 · Refine the workspace overview
changesHow many files changed, and the key for the preview. Click it to open.
cwdThe current directory, shortened
activityWhat the turn is doing, and for how long
contextHow full the context window is. Yellow past 75%, red past 90%.
costWhat the session has cost, or on a subscription, what is left of the plan
tokensTokens sent and received, and the input read from the cache
thinkingThe thinking level
modelThe model, or no model until you choose one
KeyValues
visibilityauto (shown when the dock is not beside the conversation), shown, hidden
styleslab (each module on its own block) or flat (plain text). The dock’s headings follow it.
thinking_colorstrue colors the thinking level from muted (off) to magenta (ultra)

When the bar runs out of room, it drops modules in this order: cwd, tokens, activity, cost, todo, changes, pr, branch, project, then context and thinking. The model goes last.

Icons and fonts

glyphs sets which icons Luxe draws. Every icon has a word beside it, so nothing is lost at any setting.

glyphsDrawsNeeds
autonerd when Luxe can confirm your font has every icon, otherwise unicode
nerdNerd Font iconsA Nerd Font
nerd_wideThe same icons, each given two cellsA Nerd Font whose icons are drawn wide
unicodePlain shapes: ■ ► ▪ ○ ●UTF-8
asciiPlain punctuation: / + ~ = xUTF-8, for the rest of the screen
~/.config/luxe/config.json
{ "glyphs": "nerd" }

auto asks fontconfig (fc-list) whether your fonts have every icon, and picks nerd in kitty, which brings its own. On macOS and Windows without fontconfig, it picks unicode; set nerd if you have a Nerd Font. If icons sit flush against the word beside them, you have the wide build of your Nerd Font: switch to its Mono build (see Fonts), or set nerd_wide.

Fonts that draw every character Luxe uses, measured against the font files:

FontMissingWidth
JetBrains Monoℹ︎ ↳︎ ↺︎ ⏸︎ ✔︎ ✖︎, filled in by your system0.60 em
IosevkaTermnothing0.50 em
Adwaita Mononothing0.60 em
Monaspace⏎︎, used only by luxe wire0.62 em

Use IosevkaTerm’s Term build: plain Iosevka lets some symbols overlap the next character.

The conversation

~/.config/luxe/config.json
{
  "conversation": {
    "alignment": "full",
    "growth": "bottom",
    "thinking": "shown",
    "tool_runs": "fold",
    "stream_reveal": "smooth",
    "activity_bar": "bars"
  }
}
KeyDefaultValues
alignmentfullfull uses the whole width. left or center cap the width at prose_max_width for text and wide_block_max_width for code and tables.
prose_max_width12072 to 120 columns, for left and center
wide_block_max_width14072 to 140 columns, for left and center
growthbottombottom grows up from the composer, like a chat. top grows down from the top.
thinkingshownHow the model’s reasoning appears: shown, collapsed to one line, or hidden
tool_runsfoldfold draws a run of lookups as one line. cards gives each call a card.
tool_detailserrorsWhich tool cards start open: errors, all or collapsed
stream_revealsmoothsmooth paces streaming text evenly. off draws text as soon as it comes in.
activity_barbarsThe running-turn indicator: bars, dots or off
scroll_lines3Lines per mouse wheel notch, 1 to 20
image_max_rows24The tallest an image is drawn, 3 to 200 rows

Diffs

Tool cards, the preview and Guided Review draw diffs the same way:

~/.config/luxe/config.json
{ "diff": { "layout": "auto", "word_wrap": false } }
layoutSide by side when each column fits
auto44 columns of code
split28 columns
unifiedNever

ctrl+b switches the preview or Guided Review for the session. A change that only adds or only removes lines is always one column. Within a changed line, the words that changed are bold.

word_wrap wraps long lines in Guided Review instead of scrolling sideways, and w switches it there. Tool cards always wrap, and the preview starts wrapped; alt+w switches it.

Images

Screenshots and images the agent reads are drawn in the conversation where the terminal can:

imagesDrawsNeeds
autopixels in kitty and Ghostty, off elsewhere and inside tmux or screen
pixelsThe pictureA terminal with the kitty graphics protocol
blocksA rough preview in colored blocksAny terminal with color
offA line naming the image, with open ↗ to view it
~/.config/luxe/config.json
{ "images": "auto" }

Double-click an image, or select its message (alt+k) and press alt+i, to view it full-window. /images says which setting is in effect and why. A change to images applies the next time Luxe starts.

The start screen

The start screen’s logotype is drawn in your theme’s accent, with a slow shine across it. "banner_animation": false holds it still. See The start screen for its styles, and for skipping it.