jnsahaj/lumen
{ "createdAt": "2024-10-28T17:42:55Z", "defaultBranch": "main", "description": "Beautiful git diff viewer, generate commits with AI, get summary of changes, all from the CLI", "fullName": "jnsahaj/lumen", "homepage": "", "language": "Rust", "name": "lumen", "pushedAt": "2026-07-11T17:35:37Z", "stargazersCount": 2556, "topics": [ "cli", "commit", "git", "llm", "openai", "rust" ], "updatedAt": "2026-07-12T21:13:23Z", "url": "https://github.com/jnsahaj/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
Section titled “Special Thanks”Table of Contents
Section titled “Table of Contents”- [Getting Started]!(#getting-started-)
- [Prerequisites]!(#prerequisites)
- [Installation]!(#installation)
- [Usage]!(#usage-)
- [Visual Diff Viewer]!(#visual-diff-viewer)
- [AI Features]!(#ai-features-)
- [Configuration]!(#configuration)
- [Generate Commit Messages]!(#generate-commit-messages)
- [Generate Git Commands]!(#generate-git-commands)
- [Explain Changes]!(#explain-changes)
- [Tips & Tricks]!(#tips—tricks)
- [AI Providers]!(#ai-providers)
- [Coding Agent Integrations]!(#coding-agent-integrations-)
- [Advanced Configuration]!(#advanced-configuration-)
- [Configuration File]!(#configuration-file)
- [Configuration Precedence]!(#configuration-precedence)
Getting Started 🔅
Section titled “Getting Started 🔅”Prerequisites
Section titled “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
Section titled “Installation”Using Homebrew (MacOS and Linux)
Section titled “Using Homebrew (MacOS and Linux)”brew install jnsahaj/lumen/lumenUsing Cargo
Section titled “Using Cargo”[!IMPORTANT]
cargois a package manager forrust, and is installed automatically when you installrust. See installation guide
cargo install lumenUsage 🔅
Section titled “Usage 🔅”Visual Diff Viewer
Section titled “Visual Diff Viewer”Launch an interactive side-by-side diff viewer in your terminal:
# View uncommitted changeslumen diff
# View changes for a specific commitlumen diff HEAD~1
# View changes between brancheslumen diff main..feature/A
# View changes in a GitHub Pull Requestlumen diff --pr 123 # (--pr is optional)lumen diff https://github.com/owner/repo/pull/123
# Open the PR associated with the current branchlumen diff --detect-pr
# Filter to specific fileslumen diff --file src/main.rs --file src/lib.rs
# Watch mode - auto-refresh on file changeslumen diff --watch
# Stacked mode - review commits one by onelumen diff main..feature --stacked
# Jump to a specific file on openlumen diff --focus src/main.rs
# Soft-wrap long lines (also settable in lumen.config.json)lumen diff --wrapStacked Diff Mode
Section titled “Stacked Diff Mode”Review a range of commits one at a time with --stacked:
lumen diff main..feature --stackedlumen diff HEAD~5..HEAD --stackedThis 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
Section titled “Theme Configuration”Customize the diff viewer colors with preset themes:
# Using CLI flaglumen diff --theme dracula
# Using environment variableLUMEN_THEME=catppuccin-mocha lumen diff
# Or set permanently in config file (~/.config/lumen/lumen.config.json){ "theme": "dracula"}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
Section titled “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
Section titled “Keybindings”j/kor arrow keys: Navigate{/}: Jump between hunksw: Toggle watch modetab: 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 🔅
Section titled “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
Section titled “Configuration”Run lumen configure for interactive setup (provider, API key, model). Settings are saved to ~/.config/lumen/lumen.config.json.
Generate Commit Messages
Section titled “Generate Commit Messages”Create meaningful commit messages for your staged changes:
# Basic usage - generates a commit message based on staged changeslumen draft# Output: "feat(button.tsx): Update button color to blue"
# Add context for more meaningful messageslumen draft --context "match brand guidelines"# Output: "feat(button.tsx): Update button color to align with brand identity guidelines"Generate Git Commands
Section titled “Generate Git Commands”Ask Lumen to generate Git commands based on a natural language query:
lumen operate "squash the last 3 commits into 1 with the message 'squashed commit'"# 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
Section titled “Explain Changes”Understand what changed and why:
# Working directory or staged changeslumen explainlumen explain --staged
# Specific commits or rangeslumen explain HEADlumen explain HEAD~3..HEADlumen explain main..feature/A
# Ask specific questionslumen explain --query "What's the performance impact of these changes?"
# Interactive commit selection (requires: fzf)lumen explain --listTips & Tricks
Section titled “Tips & Tricks”# Copy commit message to clipboard (macOS / Linux)lumen draft | pbcopylumen draft | xclip -selection c
# Directly commit using the generated messagelumen draft | git commit -F -lazygit integration is available — see the user config docs for binding lumen draft to a custom command.
AI Providers
Section titled “AI Providers”Configure your preferred AI provider:
# Using CLI argumentslumen -p openai -k "your-api-key" -m "gpt-5-mini" draft
# Using environment variablesexport LUMEN_AI_PROVIDER="openai"export LUMEN_API_KEY="your-api-key"export LUMEN_AI_MODEL="gpt-5-mini"Supported Providers
Section titled “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) |
Coding Agent Integrations 🔅
Section titled “Coding Agent Integrations 🔅”Use lumen as the review surface for your coding agent. When the agent finishes a turn, shell-escape to lumen, annotate the diff inline, and press s to send your annotations back as the agent’s next prompt.
agent finishes turn → !lumen diff → annotate → press `s`→ stdout returns to the agent → agent fixes your notesThe mechanics are just stdin/stdout — no plugins, no extensions:
sin the diff TUI opens a confirmation modal. OnEnter, lumen exits and writes the formatted annotations to stdout (the same textycopies to your clipboard).- The TUI auto-routes to
/dev/ttywhen stdout is captured, so the agent receives clean text — no escape codes.
Works with anything that has a shell-escape:
| Agent | How to trigger |
|---|---|
| Claude Code | !lumen diff |
| Codex | !lumen diff |
| Any agent with shell access | lumen diff from a tool/bash call |
Annotate with i (selection / hunk / file), press s → Enter to send. Press q to dismiss without sending.
Advanced Configuration 🔅
Section titled “Advanced Configuration 🔅”Configuration File
Section titled “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)
{ "provider": "openai", "model": "gpt-5-mini", "api_key": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "theme": "catppuccin-mocha", "wrap": true, "draft": { "commit_types": { "docs": "Documentation only changes", "style": "Changes that do not affect the meaning of the code", "refactor": "A code change that neither fixes a bug nor adds a feature", "perf": "A code change that improves performance", "test": "Adding missing tests or correcting existing tests", "build": "Changes that affect the build system or external dependencies", "ci": "Changes to our CI configuration files and scripts", "chore": "Other changes that don't modify src or test files", "revert": "Reverts a previous commit", "feat": "A new feature", "fix": "A bug fix" } }}Configuration Precedence
Section titled “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/.bashrcexport LUMEN_AI_PROVIDER="openai"export LUMEN_AI_MODEL="gpt-5-mini"export LUMEN_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxx"
# Override per project using config file{ "provider": "ollama", "model": "llama3.2"}
# Or override using CLI flagslumen -p "ollama" -m "llama3.2" draftContributors
Section titled “Contributors”Made with contrib.rocks.
Interested in Contributing?
Section titled “Interested in Contributing?”Contributions are welcome! Please feel free to submit a Pull Request.