Configuration
roborev uses a layered configuration system. Settings are resolved in this order (highest to lowest priority):
- CLI flags (
--agent,--model,--reasoning) - Per-repo
.roborev.tomlin your repository root - Global
~/.roborev/config.toml - Defaults (auto-detect agent, thorough reasoning for reviews)
The config Command
The roborev config command lets you inspect and modify configuration from the command line, similar to git config. It works with both global and per-repo config files.
Get a value
roborev config get default_agent # merged: tries local, then globalroborev config get default_agent --global # global config onlyroborev config get review_agent --local # repo config onlyroborev config get sync.enabled # nested keys use dot notationWithout --global or --local, get uses merged scope: it checks the repo config first, then falls back to global. The raw value is printed to stdout for easy piping.
Set a value
roborev config set default_agent codex --globalroborev config set max_workers 8 --globalroborev config set review_agent claude-code # defaults to --localroborev config set sync.enabled true --globalroborev config set ci.repos "org/repo1,org/repo2" --globalWithout --global or --local, set defaults to writing the repo config (.roborev.toml). You must be inside a git repository for local writes.
Values are automatically coerced to the correct type:
| Config type | Input format | Example |
|---|---|---|
| string | as-is | codex |
| integer | decimal number | 8 |
| boolean | true/false, 1/0 | true |
| string array | comma-separated | "org/repo1,org/repo2" |
Writes are atomic (temp file + rename) and preserve file permissions: 0600 for global config (which may contain secrets) and 0644 for repo config.
List all values
roborev config list # merged config (effective values)roborev config list --global # global config onlyroborev config list --local # repo config onlyroborev config list --show-origin # show where each value comes fromThe --show-origin flag adds a column showing whether each value comes from global, local, or default:
global default_agent codexlocal review_agent claude-codedefault max_workers 4Sensitive values (API keys, database URLs) are automatically masked in list output, showing only the last 4 characters.
Per-Repository Configuration
Create .roborev.toml in your repository root to customize behavior for that project.
agent = "gemini" # AI agent to usemodel = "gemini-3-flash-preview" # Model override for this reporeview_context_count = 5 # Recent reviews to include as contextdisplay_name = "backend" # Custom name shown in TUI (optional)excluded_branches = ["wip", "scratch"] # Branches to skip reviews on
# Reasoning levels: thorough, standard, fastreview_reasoning = "thorough" # For code reviews (default: thorough)refine_reasoning = "standard" # For refine command (default: standard)
# Severity filteringreview_min_severity = "medium" # Skip low-severity findings in reviewsfix_min_severity = "medium" # Skip low-severity findings in fixrefine_min_severity = "medium" # Skip low-severity findings in refine
# Session reuse (experimental)reuse_review_session = true # Resume prior agent sessions on same branch
# Auto-close passing reviewsauto_close_passing_reviews = true
# Project-specific review guidelinesreview_guidelines = """No database migrations needed - no production databases yet.Prefer composition over inheritance.All public APIs must have documentation comments."""Per-Repository Options
| Option | Type | Description |
|---|---|---|
agent | string | AI agent to use for this repo |
model | string | Model to use (overrides global default_model) |
display_name | string | Custom name shown in TUI |
review_context_count | int | Number of recent reviews to include as context |
excluded_branches | array | Branches to skip automatic reviews on |
excluded_commit_patterns | array | Commit message substrings to skip reviews on (case-insensitive) |
exclude_patterns | array | Filenames or glob patterns to exclude from review diffs for this repo |
post_commit_review | string | Post-commit hook behavior: "commit" (default) or "branch" |
auto_close_passing_reviews | bool | Automatically close reviews that pass with no findings |
review_reasoning | string | Reasoning level for reviews: thorough, standard, fast |
refine_reasoning | string | Reasoning level for refine: thorough, standard, fast |
review_min_severity | string | Minimum severity for reviews: critical, high, medium, or low. Cascades: CLI flag > repo config > global config |
fix_min_severity | string | Minimum severity for fix: critical, high, medium, or low |
refine_min_severity | string | Minimum severity for refine: critical, high, medium, or low |
reuse_review_session | bool | (Experimental) Resume prior agent sessions on the same branch. See Session Reuse |
reuse_review_session_lookback | int | Max recent session candidates to consider (default: unlimited). See Session Reuse |
review_agent_<level> | string | Agent to use for reviews at specific reasoning level |
review_model_<level> | string | Model to use for reviews at specific reasoning level |
refine_agent_<level> | string | Agent to use for refine at specific reasoning level |
refine_model_<level> | string | Model to use for refine at specific reasoning level |
fix_agent | string | Agent to use for fix / analyze —fix |
fix_agent_<level> | string | Agent to use for fix at specific reasoning level |
fix_model | string | Model to use for fix / analyze —fix |
fix_model_<level> | string | Model to use for fix at specific reasoning level |
security_agent | string | Agent to use for --type security reviews |
security_agent_<level> | string | Agent for security reviews at specific reasoning level |
security_model | string | Model for security reviews |
security_model_<level> | string | Model for security reviews at specific reasoning level |
design_agent | string | Agent to use for --type design reviews |
design_agent_<level> | string | Agent for design reviews at specific reasoning level |
design_model | string | Model for design reviews |
design_model_<level> | string | Model for design reviews at specific reasoning level |
backup_agent | string | Fallback agent if primary fails |
review_backup_agent | string | Fallback agent for reviews |
refine_backup_agent | string | Fallback agent for refine |
fix_backup_agent | string | Fallback agent for fix |
security_backup_agent | string | Fallback agent for security reviews |
design_backup_agent | string | Fallback agent for design reviews |
review_guidelines | string | Project-specific guidelines for the reviewer |
max_prompt_size | int | Maximum prompt size in bytes for this repo (default: 200000) |
Review Guidelines
Use review_guidelines to give the AI reviewer project-specific
context: suppress irrelevant warnings, enforce conventions, or
describe trust boundaries and architecture so the reviewer doesn’t
flag non-issues:
review_guidelines = """This is a local CLI tool. The daemon runs on localhost and alldisplayed data originates from the user's own filesystem and gitrepos. Do not flag injection or sanitization for data that nevercrosses a trust boundary.
Performance is critical - flag any O(n^2) or worse algorithms.All error messages must be user-friendly."""Guidelines are included in the review prompt, so they shape what the reviewer flags and what it ignores. Common uses:
- Trust boundaries: Describe where untrusted data enters the system so the reviewer doesn’t flag sanitization for trusted paths.
- Architecture constraints: Note that the daemon and client evolve in lockstep, that backward compatibility isn’t required, etc.
- Suppress noise: Tell the reviewer to skip narrow-terminal overflow, localhost rate-limiting, or other non-issues for your project.
Workflow-Specific Agent and Model
Use different agents or models depending on the workflow and reasoning level:
# Use a faster model for quick reviews, thorough model for deep analysisreview_model = "claude"review_model_fast = "claude-sonnet-4-5-20250929"review_model_thorough = "claude-opus-4-5-20251101"
# Use different agents and models for refinerefine_agent_fast = "gemini"refine_model_fast = "gemini-3-flash"refine_agent_thorough = "codex"refine_model_thorough = "gpt-5.2-codex"Base keys use the pattern {workflow}_agent and {workflow}_model (e.g. review_model, refine_agent, fix_agent, security_agent, design_model) to set the default for each workflow. Level-specific keys override for a given reasoning level:
{workflow}_model_{level}or{workflow}_agent_{level}workflowisreview,refine,fix,security, ordesignlevelisthorough,standard, orfast
The fallback hierarchy for each workflow is:
- CLI flag > repo
{workflow}_agent_{level}> repo{workflow}_agent> repoagent> global{workflow}_agent_{level}> global{workflow}_agent> globaldefault_agent>codex
Backup Agents
If the primary agent fails (rate limits, network errors, crashes), roborev can automatically retry the job with a backup agent. This is useful when your primary agent has usage caps. For example, Codex plans often hit rate limits during heavy review sessions, so falling back to Claude Code keeps reviews flowing.
default_agent = "codex"default_backup_agent = "claude-code" # Fallback for any workflowdefault_backup_model = "claude-sonnet-4-20250514" # Model for the backup agentWhen a backup agent takes over, it uses the model specified by default_backup_model. Without this setting, the backup agent uses whatever model is configured for it normally. This is useful when your backup agent needs a different model than the one configured as default_model (which is typically chosen for the primary agent).
You can also set backup agents per workflow:
review_backup_agent = "claude-code" # Fallback for reviewsrefine_backup_agent = "codex" # Fallback for refinefix_backup_agent = "claude-code" # Fallback for fixPer-repo overrides work the same way in .roborev.toml:
backup_agent = "claude-code" # Repo-level fallbackreview_backup_agent = "gemini" # Workflow-specific overrideWhen a job fails with an agent error (not a review finding), roborev resolves the backup agent in this order:
- Repo-level workflow-specific backup (e.g.
review_backup_agentin.roborev.toml) - Repo-level generic
backup_agent - Global workflow-specific backup (e.g.
review_backup_agentinconfig.toml) - Global
default_backup_agent
If a backup agent is found and installed, the job is retried with that agent. The failover is logged in the daemon output. If no backup is configured or the backup agent isn’t installed, the job fails normally.
Agent Command Overrides
If an agent binary is installed under a non-standard name or path, use a *_cmd setting to tell roborev where to find it:
claude_code_cmd = "/opt/bin/claude"codex_cmd = "codex-nightly"cursor_cmd = "/usr/local/bin/agent"opencode_cmd = "/usr/local/bin/opencode-wrapper"pi_cmd = "~/bin/pi"| Option | Default command |
|---|---|
claude_code_cmd | claude |
codex_cmd | codex |
cursor_cmd | agent |
opencode_cmd | opencode |
pi_cmd | pi |
These overrides affect both agent execution and availability detection. Without them, roborev only checks for the default command name when deciding whether an agent is installed.
Agent Name Validation
Unknown agent names in configuration files and CLI flags are now validated and rejected early. If you specify an agent name that roborev doesn’t recognize, you’ll get a clear error message at startup or command invocation instead of a confusing failure later.
Excluded Branches
Skip automatic reviews on work-in-progress branches:
excluded_branches = ["wip", "scratch", "experiment"]Reviews triggered manually with roborev review still work on these branches.
Excluded Commit Patterns
Skip reviews for commits whose messages contain specific substrings (case-insensitive matching):
excluded_commit_patterns = ["[skip review]", "wip:", "fixup!"]When reviewing a range, the range is skipped only if every commit in the range matches. Manually triggered reviews with roborev review are not affected.
Exclude Patterns
Common lockfiles and generated files are excluded from review diffs by default: package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb, bun.lock, uv.lock, poetry.lock, Pipfile.lock, pdm.lock, go.sum, Cargo.lock, Gemfile.lock, composer.lock, packages.lock.json, pubspec.lock, mix.lock, Package.resolved, Podfile.lock, flake.lock, and the .beads/, .gocache/, and .cache/ directories.
To exclude additional files, use exclude_patterns in either global or per-repo config:
exclude_patterns = ["generated.go", "*.pb.go", "vendor/"]exclude_patterns = ["*.min.js", "dist/"]Patterns can be filenames, directory names (with trailing /), or glob patterns (including **). Both global and repo-level patterns are merged. User patterns are appended to the built-in exclusion list.
Prompt Size Budget
The max_prompt_size (per repo) and default_max_prompt_size (global) settings control the maximum size in bytes of the prompt sent to review agents. The per-repo value takes precedence over the global default. The default is 200,000 bytes (~200 KB).
default_max_prompt_size = 300000 # 300 KB global default
# .roborev.tomlmax_prompt_size = 500000 # 500 KB for this repo onlyThis limit applies to all review commands (review, compact, ci review) and all agents. When a diff exceeds the budget, roborev truncates it at a UTF-8 boundary and includes fallback instructions that guide the agent to read the diff locally using git commands. Optional context (prior reviews, guidelines) is trimmed first to preserve as much diff as possible.
Post-Commit Review Mode
By default, the post-commit hook reviews the single commit at HEAD. Set post_commit_review = "branch" to review all commits since the branch diverged from the base branch instead:
post_commit_review = "branch"When set to "branch", each commit triggers a merge-base..HEAD range review covering the entire branch. On the base branch itself (e.g. main), detached HEAD, or any error, the hook falls back to a single-commit review.
This setting only affects the post-commit hook. roborev review is not changed by this option.
Auto-Close Passing Reviews
By default, all reviews remain open in the queue until you explicitly close them. Set auto_close_passing_reviews = true to automatically close reviews that pass with no findings:
auto_close_passing_reviews = trueWhen enabled, reviews with a passing verdict are closed immediately after the verdict is parsed. Failed reviews remain open for attention. This is useful if you only want to focus on reviews that found issues.
The option works in both global config (~/.roborev/config.toml) and per-repo config (.roborev.toml). Per-repo settings override the global value.
Global Configuration
Create ~/.roborev/config.toml to set system-wide defaults.
default_agent = "codex"default_model = "gpt-5.2-codex" # Default LLMdefault_backup_model = "claude-sonnet-4-20250514" # Fallback model for backup agentserver_addr = "127.0.0.1:7373"max_workers = 4job_timeout = "10m" # Per-job timeout (default: 10m)hide_closed_by_default = true # Start TUI with closed/failed/canceled hiddenauto_filter_repo = true # Auto-filter TUI to current repo on startupauto_filter_branch = true # Auto-filter TUI to current branch/worktree on startupmouse_enabled = true # Enable mouse interactions in the TUItab_width = 4 # Tab expansion width for code blocks in TUI (default: 2)column_borders = true # Show separators between TUI columnsGlobal Options
| Option | Type | Default | Description | Hot-Reload |
|---|---|---|---|---|
default_agent | string | auto-detect | Default AI agent to use | Yes |
default_backup_agent | string | - | Fallback agent when the primary fails | Yes |
default_backup_model | string | - | Fallback model used when a backup agent runs | Yes |
default_model | string | agent default | Model to use (format varies by agent) | Yes |
server_addr | string | 127.0.0.1:7373 | Daemon listen address. Use unix:// for Unix domain socket (see Unix Domain Socket) | No |
max_workers | int | 4 | Number of parallel review workers | No |
job_timeout | duration | 10m | Per-job timeout | Yes |
allow_unsafe_agents | bool | false | Enable agentic mode globally | Yes |
anthropic_api_key | string | - | Anthropic API key for Claude Code | Yes |
review_context_count | int | 3 | Recent reviews to include as context | Yes |
reuse_review_session | bool | false | (Experimental) Resume prior agent sessions on the same branch. See Session Reuse | Yes |
reuse_review_session_lookback | int | 0 | Max recent session candidates to consider (0 = unlimited) | Yes |
auto_close_passing_reviews | bool | false | Automatically close reviews that pass with no findings | Yes |
review_min_severity | string | - | Default minimum severity for reviews: critical, high, medium, or low | Yes |
fix_min_severity | string | - | Default minimum severity for fix: critical, high, medium, or low | Yes |
refine_min_severity | string | - | Default minimum severity for refine: critical, high, medium, or low | Yes |
disable_codex_sandbox | bool | false | Disable Codex bwrap sandboxing for systems where it is unavailable | Yes |
hide_closed_by_default | bool | false | Start TUI with closed/failed/canceled reviews hidden | N/A |
auto_filter_repo | bool | false | Auto-filter TUI to the current repo on startup | N/A |
auto_filter_branch | bool | false | Auto-filter TUI to the current branch/worktree on startup | N/A |
mouse_enabled | bool | true | Enable mouse interactions in the TUI (also togglable from the TUI options menu) | N/A |
tab_width | int | 2 | Tab expansion width for code blocks in TUI (1-16) | N/A |
column_borders | bool | false | Show ▕ separators between TUI columns | N/A |
column_order | array | Custom queue column display order | N/A | |
task_column_order | array | Custom task column display order | N/A | |
claude_code_cmd | string | claude | Custom path or name for the Claude Code binary | Yes |
codex_cmd | string | codex | Custom path or name for the Codex binary | Yes |
cursor_cmd | string | agent | Custom path or name for the Cursor binary | Yes |
opencode_cmd | string | opencode | Custom path or name for the OpenCode binary | Yes |
pi_cmd | string | pi | Custom path or name for the Pi binary | Yes |
exclude_patterns | array | [] | Filenames or glob patterns to exclude from review diffs globally | Yes |
default_max_prompt_size | int | 200000 | Default maximum prompt size in bytes for review prompts | Yes |
Hot-Reload
The daemon automatically watches ~/.roborev/config.toml for
changes. Most settings take effect immediately without restarting the
daemon.
Settings that require daemon restart: server_addr, max_workers, the [ci] section, and the [sync] section.
Data Directory
All roborev data is stored in ~/.roborev/ by default:
~/.roborev/├── config.toml # Global configuration├── daemon.json # Runtime state (port, PID)├── post-commit.log # JSONL log of post-commit hook invocations├── reviews.db # SQLite database└── logs/jobs/ # Persistent job output logsOverride with the ROBOREV_DATA_DIR environment variable:
export ROBOREV_DATA_DIR=/custom/pathUnix Domain Socket
On Unix systems, the daemon can listen on a Unix domain socket instead of TCP loopback. This provides filesystem-level access control: the socket is created with 0600 permissions and its parent directory with 0700, so only the owning user can connect.
To enable Unix domain sockets, set server_addr to unix://:
server_addr = "unix://"With unix:// (no path), the socket is created at $XDG_RUNTIME_DIR/roborev/daemon.sock when $XDG_RUNTIME_DIR is set and points to an existing absolute directory. Otherwise, the socket is placed under the platform temp directory (e.g. /tmp on Linux, /var/folders/.../T on macOS) at {tempdir}/roborev-{UID}/daemon.sock, where {UID} is your numeric user ID. To use a specific path:
server_addr = "unix:///var/run/roborev/daemon.sock"The CLI flag works the same way:
roborev --server unix:// tuiroborev daemon run --addr "unix:///custom/path.sock"Stale socket files from previous daemon runs are cleaned up automatically on startup. The socket is removed on graceful shutdown.
Persistent Daemon
The daemon starts automatically when you run roborev init or any command that needs it, and stays running in the background. This is sufficient for most users. If you want the daemon to survive reboots, restart on failure, or be managed alongside other system services, set up a system service.
macOS (launchd):
# Resolve paths — Homebrew prefix differs between Intel and Apple SiliconROBOREV_BIN="$(command -v roborev)"BREW_PREFIX="$(brew --prefix 2>/dev/null || echo /usr/local)"
mkdir -p ~/Library/Logs/roborevcat > ~/Library/LaunchAgents/com.roborev.daemon.plist << EOF<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.roborev.daemon</string> <key>ProgramArguments</key> <array> <string>${ROBOREV_BIN}</string> <string>daemon</string> <string>run</string> </array> <key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>${BREW_PREFIX}/bin:${BREW_PREFIX}/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> </dict> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>StandardOutPath</key> <string>${HOME}/Library/Logs/roborev/daemon.log</string> <key>StandardErrorPath</key> <string>${HOME}/Library/Logs/roborev/daemon.log</string></dict></plist>EOF
launchctl load ~/Library/LaunchAgents/com.roborev.daemon.plistThe heredoc expands ${ROBOREV_BIN}, ${BREW_PREFIX}, and ${HOME} at generation time so the plist contains absolute paths. Launchd does not expand ~ or environment variables in plist values.
Linux (systemd):
roborev ships with roborev.service and roborev.socket unit files in its packaging/systemd/ directory. If your package manager installed the unit files, enable the user-level service:
systemctl --user enable --now roborevFor on-demand startup via socket activation, enable the socket unit instead. The daemon starts automatically when a client connects and uses Type=notify to signal readiness back to systemd:
systemctl --user enable --now roborev.socketIf the unit files are not available (e.g., you used go install or the install script), create a service unit manually. This covers the always-on service mode; socket activation requires the bundled unit files.
# Resolve the actual binary path for ExecStartROBOREV_BIN="$(command -v roborev)"
mkdir -p ~/.config/systemd/usercat > ~/.config/systemd/user/roborev.service << EOF[Unit]Description=roborev daemonAfter=network.target
[Service]ExecStart=${ROBOREV_BIN} daemon runRestart=on-failure
[Install]WantedBy=default.targetEOF
systemctl --user enable --now roborevEnvironment Variables
| Variable | Description |
|---|---|
ROBOREV_DATA_DIR | Override default data directory (~/.roborev) |
ROBOREV_COLOR_MODE | Color theme: auto (default), dark, light, none. See Color Mode |
NO_COLOR | Set to any value to disable all color output (no-color.org) |
Color Mode
The TUI automatically adapts to light and dark terminals by default. Use ROBOREV_COLOR_MODE to override the auto-detection:
| Value | Behavior |
|---|---|
auto | Detect terminal background color (default) |
dark | Force dark color palette |
light | Force light color palette |
none | Strip all colors (equivalent to NO_COLOR=1) |
ROBOREV_COLOR_MODE=dark roborev tuiNO_COLOR takes precedence over ROBOREV_COLOR_MODE at all layers. When NO_COLOR is set, all ANSI color sequences are stripped regardless of ROBOREV_COLOR_MODE.
Model Selection
The default_model setting specifies which model agents should use. The format varies by agent:
# OpenAI models (Codex, Copilot)default_model = "gpt-5.2"
# Anthropic models (Claude Code)default_model = "claude-sonnet-4-5-20250929"
# OpenCode (provider/model format)default_model = "anthropic/claude-sonnet-4-5-20250929"Agentic Mode
Enable agentic mode globally (allows agents to edit files and run commands):
allow_unsafe_agents = trueAdvanced Section
The [advanced] section controls opt-in features that are not part of the default workflow.
[advanced]enable_tasks = true # Enable background tasks in the TUI| Option | Type | Default | Description |
|---|---|---|---|
enable_tasks | bool | false | Enable the TUI background tasks workflow (fix jobs, patch application, rebasing) |
When enabled, the TUI exposes the F (fix) and T (tasks) shortcuts for launching fix jobs and managing patches. See Background Tasks for the full reference.
Hooks
Run shell commands when reviews complete or fail. See the Review Hooks guide for full details.
# In config.toml or .roborev.toml[[hooks]]event = "review.failed" # or "review.completed", "review.*"command = "notify-send 'Review failed for {repo_name}'"
[[hooks]]event = "review.failed"type = "beads" # Built-in: creates a bd issue automaticallyHook Options
| Option | Type | Description |
|---|---|---|
event | string | Event to match: review.completed, review.failed, or review.* |
command | string | Shell command with {var} template interpolation |
type | string | Built-in hook type (beads, webhook), or omit for custom command |
url | string | Webhook destination URL (required when type = "webhook") |
Template variables: {job_id}, {repo}, {repo_name}, {sha}, {agent}, {verdict}, {findings}, {error}
Reasoning Levels
Reasoning levels control how deeply the AI analyzes code.
| Level | Description | Best For |
|---|---|---|
maximum | Deepest analysis; maps to Codex xhigh reasoning | Complex reviews requiring maximum depth |
thorough | Deep analysis with extended thinking | Code reviews (default) |
standard | Balanced analysis | Refine command (default) |
fast | Quick responses | Rapid feedback |
maximum is accepted as max or xhigh on the command line. For agents without an xhigh equivalent (Droid, Kilo, Pi), it maps to their highest available level (same as thorough).
Set per-command with --reasoning, or per-repo in .roborev.toml:
roborev review --reasoning fast # Quick reviewroborev refine --reasoning thorough # Careful fixesAuthentication
Claude Code
Claude Code uses your Claude subscription by default. roborev
deliberately ignores ANTHROPIC_API_KEY from the environment to avoid
unexpected API charges.
To use Anthropic API credits instead of your subscription:
anthropic_api_key = "sk-ant-..."roborev automatically sets CLAUDE_NO_SOUND=1 when running Claude
agents to suppress notification and completion sounds.
Other Agents
- Codex: Uses authentication from
codex auth - Gemini: Uses authentication from Gemini CLI
- Copilot: Uses GitHub Copilot subscription via GitHub CLI
- OpenCode: Uses API keys configured in its own settings, set model to use in config TOML files
Environment Variable Expansion
Sensitive values can reference environment variables:
anthropic_api_key = "${ANTHROPIC_API_KEY}"This keeps secrets out of config files while still allowing roborev to use them.