Luxe

Quickstart

From first launch to a reviewed pull request.

View as Markdown

This walks through one change from start to finish: connect a model, ask for something, review what the agent did, and open a pull request.

1. Start Luxe in your project

cd your-project
git switch -c category-enum    # a branch for the work, so it can become a pull request
luxe

Reviewing changes and opening a pull request need a Git repository. A pull request also needs a branch other than the one it merges into; luxe --worktree makes one for you, in a worktree of its own.

The first time, Luxe asks four questions: a theme, a provider, which tools the agent can use, and what Luxe opens on. Each one previews or explains itself, and enter moves on. s skips setup and keeps none of the answers, though a provider you signed in to stays signed in. Your answers go to ~/.config/luxe/config.json, and /settings or luxe init changes them later.

󰒓 Welcome to Luxe 1 Theme 2 Provider 3 Tools 4 Start ❯ luxe (Luxe's own) Rename the dock's headings to match the rail nord dracula Two headings drift from the rail's names; renaming both. gruvbox tokyo-night ± edit src/view/dock.rs 6ms kanagawa 734 fn heading(section: Section) { rose-pine -735 let label = "FILES"; catppuccin +735 let label = "CHANGES"; everforest 736 } github one-dark PLAN CHANGES MODEL ayu monokai info warning error success aura zenburn jetbrains noctis-bordo panda vesper ↑/↓ preview · enter use this one · s skip setup ~/.config/luxe/config.json
Setup, on its theme step

After that, Luxe opens on the start screen: a prompt, with your last session, your other sessions and Configuration listed under it, or Set up a provider first if you have none yet. Type to ask something or to find a session or a command, or use ↑/↓ and enter to open a row.

󱌣 build Ask anything, or type to find a session or a command ❯ 󰋚 Resume Refine the workspace overview 12m ago 󰈔 New session /new 󰈞 Sessions… /sessions Review changes 12 files +640 −118 /diff 󰒓 Configuration /config 󰗼 Quit ctrl+c RECENT 󰊌 Audit the current project structure 1d ago 󰊌 Please explain why this provider stalls 2d ago 󰊌 Trace the stalled provider handshake 2d ago enter resume · ↑/↓ choose · shift+tab plan mode · ctrl+c quit 󰉋 luxe 󰘬 feature/context-dock*  0.0%/200k 󰌵 high 󰚩 qwen3.8-27b
The start screen

2. Connect a model

If you skipped the provider question, the start screen leads with Set up a provider. Open it and pick one:

OptionFor
Sign in to a subscriptionChatGPT Plus or Pro, GitHub Copilot, OpenRouter
Add an API keyOpenAI, Anthropic, Google, Groq and others
Connect a local or custom modelLM Studio, Ollama, Azure, any OpenAI-compatible endpoint

󰒓 Configuration No provider is configured yet. ❯ Sign in to a subscription [1] ChatGPT Plus or Pro, GitHub Copilot, OpenRouter Add an API key [2] OpenAI, Anthropic, Google, Groq, and a dozen others Connect a local or custom model [3] LM Studio, Ollama, Azure, any OpenAI-compatible endpoint Settings [4] Appearance, the conversation, the dock, tools and the agent Edit configuration files [5] Credentials, models, key bindings, and every setting enter open · ↑/↓ choose · esc back
Configuration, before a provider is set up

When it connects, the model picker opens. Choose a model, and change it any time with /model.

An API key in your environment works too. Luxe finds ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY and the rest, and offers that provider’s models. To sign in from a script or a machine without the interface, use the CLI:

luxe auth login                       # choose a provider from a list
luxe auth login anthropic --stdin < key.txt
luxe auth list                        # every provider and how it is configured

Credentials are stored in ~/.config/luxe/auth.json, readable only by you. See Providers for every option.

3. Ask for something

Type what you want on the start screen and press enter: it starts a new session and sends it. shift+enter adds a line.

a notification's category is a free-form string, so a typo compiles; make it an enum

The agent reads, edits and runs commands, and each step appears as a card. Click a card to see its full output, or press ctrl+o for every card’s; ctrl+esc stops the turn. You can keep typing while it works: a message sent mid-turn reaches the agent between steps, without stopping it.

󰞷 bash cargo nextest run -p luxe-tui 2s 󰄵 todo update · in_progress 1ms · fold a run of lookups into one line ⠋  read 6/7 crates/luxe-tui/src/app/conversation.rs read crates/luxe-tui/src/view/blocks.rs read crates/luxe-tui/src/view/tool_card/mod.rs grep "tool_header_line" in crates read crates/luxe-tui/src/app/conversation.rs … · ctrl+esc to interrupt 󱌣 build 󰌵 off 󰚩 qwen3.8-27b
A turn in progress

Changes (ctrl+p) shows the diff so far, beside the conversation on a wide terminal and in its place on a narrow one.

4. Review the change

Press ctrl+g to start a Guided Review. Luxe writes a guide to the change, split into chapters, each with what changed, why, and how it was checked, next to the code. When review ready shows above the prompt, press ctrl+g again to open it.

Type the notification category working tree · 6 to review · 1 accounted for · No feedback yet · Chapters 0/4 · 6 files · +50 −12 · 7 hunks 01 / 04 Make an invalid category unrepresentable A category was a string, so a typo type-checked. This is the type that stops it. › src/notification.rs +8 −4 1 mechanical change collapsed · 4 lines · f opens them ┃ › @@ -12,4 +12,4 @@ pub struct Notification ┃ 12 pub struct Notification { 12 pub struct Notification { ┃ 13 - pub category: String, 13 + pub category: Category, ┃ 14 pub title: String, 14 pub title: String, ┃ 15 pub body: String, 15 pub body: String, @@ -34,4 +34,8 @@ impl Notification 34 impl Notification { 34 impl Notification { 35 - pub fn label(&self) -> &str { 35 + pub fn label(&self) -> &'static str { 36 - self.category.as_str() 36 + match self.category { 37 - } 37 + Category::Build => "Build", 38 + Category::Deploy => "Deploy", 39 + Category::Incident => "Incident", 40 + } 41 + } space next · c comment · a ask agent · alt+enter finish · ? help
Guided Review

KeyDoes
spaceNext
cComment on the line under the cursor
aAsk the agent about it
alt+enterFinish the review
?Every key in the review

Comments go to the agent as work to do when you finish with Request fixes.

5. Open a pull request

This needs the GitHub CLI, gh, signed in (gh auth login): Open pull request is offered once gh says the branch has none. Finish the review (alt+enter) and choose it. Luxe drafts the title and description from the review. The heading says what happens before it opens, such as “commits and pushes first”. The pull request pictured came from a session that took up an issue (luxe --issue 123), so its branch is named for the issue and its description closes it.

Refactor notification model working tree · 2 to review · No feedback yet · Chapters 0/1 · 1 file · +2 −1 · 2 hunks 01 / 01 Shared notification model Separates category concepts so platform clients share one stable shape. › sr 󰊤 Open pull request Into main from 123-category-enum · commits and pushes first ┃ › Title ┃ Refactor notification model ┃ ┃ Description ┃ Notification categories were free-form strings, so a typo reached the dispatcher and rendered as an empty label. 1 Shared notification model Separates category concepts so platform clients share one stable shape. — e Closes #123 enter open · t title · e description · E in your editor · d draft · esc cancel
Opening a pull request

Press t or e to edit the title or description, d to open it as a draft, and enter to open it.

6. Come back later

Resume, the first row on the start screen, picks up your last session. From the command line:

luxe -c                    # the most recent session in this project
luxe sessions list         # this project's sessions, newest first
luxe --resume <id>         # a specific one

Next

  • The interface: the dock, the statusline, the Command Palette and every command.
  • Guided Review: reviewing someone else’s pull request, and answering review threads on yours.
  • Configuration: themes, keys and the statusline.
  • Project context: give the agent your project’s conventions in AGENTS.md.