lumen
A fast terminal diff viewer and code review TUI, written in Rust.
Review git diff, commits, branches, or GitHub PRs side-by-side without leaving your terminal. Ships as a single static Rust binary and stays snappy on multi-thousand-line diffs.
- Side-by-side diff viewer with tree-sitter syntax highlighting
- Review GitHub Pull Requests with
lumen diff --pr 123 - Annotate selections, hunks, or whole files
- Watch mode and stacked-commit review
- Optional AI commit messages and change explanations (10+ providers)
- Works with Git and Jujutsu (jj)
Special Thanks
Table of Contents
Getting Started 🔅
Prerequisites
Before you begin, ensure you have:
gitinstalled on your system- fzf (optional) - Required for
lumen explain --listcommand - mdcat (optional) - Required for pretty output formatting
Installation
Using Homebrew (MacOS and Linux)
Using Cargo
[!IMPORTANT]
cargois a package manager forrust, and is installed automatically when you installrust. See installation guide
Usage 🔅
Visual Diff Viewer
Launch an interactive side-by-side diff viewer in your terminal:
# View uncommitted changes
# View changes for a specific commit
# View changes between branches
# View changes in a GitHub Pull Request
# Filter to specific files
# Watch mode - auto-refresh on file changes
# Stacked mode - review commits one by one
# Jump to a specific file on open
Stacked Diff Mode
Review a range of commits one at a time with --stacked:
This displays each commit individually, letting you navigate through them:
ctrl+h/ctrl+l: Previous / next commit- Click the
‹/›arrows in the header
The header shows the current commit position, SHA, and message. Viewed files are tracked per commit, so your progress is preserved when navigating.
When viewing a PR, you can mark files as viewed (syncs with GitHub) using the space keybinding.
Theme Configuration
Customize the diff viewer colors with preset themes:
# Using CLI flag
# Using environment variable
LUMEN_THEME=catppuccin-mocha
# Or set permanently in config file (~/.config/lumen/lumen.config.json)
{
}
Available themes:
| Theme | Value |
|---|---|
| Default (auto-detect) | dark, light |
| Catppuccin | catppuccin-mocha, catppuccin-latte |
| Dracula | dracula |
| Nord | nord |
| One Dark | one-dark |
| Gruvbox | gruvbox-dark, gruvbox-light |
| Solarized | solarized-dark, solarized-light |
Priority: CLI flag > config file > LUMEN_THEME env var > OS auto-detect.
Selection & Annotations
Selection: Click-drag in the content area for character-level selection, or on line numbers for line-level selection. Selected text can be copied or annotated.
Annotations: Add review comments at three levels of granularity:
- Selection — select lines with mouse, press
ito annotate the selected range - Hunk — focus a hunk with
{/}, pressito annotate the hunk - File — press
iwith no selection or hunk focus to annotate the whole file
Annotated lines display a ▍ gutter indicator. Use I to view, edit, delete, copy, or export all annotations.
Keybindings
j/kor arrow keys: Navigate{/}: Jump between hunkstab: Toggle sidebarspace: Mark file as viewede: Open file in editory: Copy selection (or filename)i: Annotate selection / hunk / fileI: View all annotationsctrl+h/l: Previous/next commit (stacked mode)?: Show all keybindings
AI Features 🔅
Lumen also bundles optional AI helpers for commit messages, explanations, and natural-language git commands. These require configuring an AI provider — the diff viewer above does not.
Configuration
Run lumen configure for interactive setup (provider, API key, model). Settings are saved to ~/.config/lumen/lumen.config.json.
Generate Commit Messages
Create meaningful commit messages for your staged changes:
# Basic usage - generates a commit message based on staged changes
# Output: "feat(button.tsx): Update button color to blue"
# Add context for more meaningful messages
# Output: "feat(button.tsx): Update button color to align with brand identity guidelines"
Generate Git Commands
Ask Lumen to generate Git commands based on a natural language query:
# Output: git reset --soft HEAD~3 && git commit -m "squashed commit" [y/N]
The command will display an explanation of what the generated command does, show any warnings for potentially dangerous operations, and prompt for confirmation before execution.
Explain Changes
Understand what changed and why:
# Working directory or staged changes
# Specific commits or ranges
# Ask specific questions
# Interactive commit selection (requires: fzf)
Tips & Tricks
# Copy commit message to clipboard (macOS / Linux)
|
|
# Directly commit using the generated message
|
lazygit integration is available — see the user config docs for binding lumen draft to a custom command.
AI Providers
Configure your preferred AI provider:
# Using CLI arguments
# Using environment variables
Supported Providers
| Provider | API Key Required | Models |
|---|---|---|
OpenAI openai (Default) |
Yes | gpt-5.2, gpt-5, gpt-5-mini, gpt-5-nano, gpt-4.1, gpt-4.1-mini, o4-mini (default: gpt-5-mini) |
Claude claude |
Yes | claude-sonnet-4-5-20250930, claude-opus-4-5-20251115, claude-haiku-4-5-20251015 (default: claude-sonnet-4-5-20250930) |
Gemini gemini |
Yes (free tier) | gemini-3-pro, gemini-3-flash-preview, gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite (default: gemini-2.5-flash) |
Groq groq |
Yes (free) | llama-3.3-70b-versatile, llama-3.1-8b-instant, meta-llama/llama-4-maverick-17b-128e-instruct, openai/gpt-oss-120b (default: llama-3.3-70b-versatile) |
DeepSeek deepseek |
Yes | deepseek-chat (V3.2), deepseek-reasoner (default: deepseek-chat) |
xAI xai |
Yes | grok-4, grok-4-mini, grok-4-mini-fast (default: grok-4-mini-fast) |
OpenCode Zen opencode-zen |
Yes | see list (default: claude-sonnet-4-5) |
Ollama ollama |
No (local) | see list (default: llama3.2) |
OpenRouter openrouter |
Yes | see list (default: anthropic/claude-sonnet-4.5) |
Vercel AI Gateway vercel |
Yes | see list (default: anthropic/claude-sonnet-4.5) |
Advanced Configuration 🔅
Configuration File
Lumen supports configuration through a JSON file. You can place the configuration file in one of the following locations:
- Project Root: Create a lumen.config.json file in your project's root directory.
- Custom Path: Specify a custom path using the --config CLI option.
- Global Configuration (Optional): Place a lumen.config.json file in your system's default configuration directory:
- Linux/macOS:
~/.config/lumen/lumen.config.json - Windows:
%USERPROFILE%\.config\lumen\lumen.config.json
- Linux/macOS:
Lumen will load configurations in the following order of priority:
- CLI arguments (highest priority)
- Configuration file specified by --config
- Project root lumen.config.json
- Global configuration file (lowest priority)
Configuration Precedence
Options are applied in the following order (highest to lowest priority):
- CLI Flags
- Configuration File
- Environment Variables
- Default options
Example: Using different providers for different projects:
# Set global defaults in .zshrc/.bashrc
# Override per project using config file
{
}
# Or override using CLI flags
Contributors
Made with contrib.rocks.
Interested in Contributing?
Contributions are welcome! Please feel free to submit a Pull Request.