Configuration
rev0 reads its configuration from environment variables. On startup it loads
~/.rev0/.env (or .env under REV0_DATA_ROOT if you moved the data root), and a
variable set in the real environment always wins over the file. The one-line installer
starts you off with a copy of .env.example.
Many variables only seed a board setting: once you save that setting in Settings, the saved value wins over the variable. Their descriptions start with “Seeds”.
Jira integration (import-only)
Section titled “Jira integration (import-only)”Create an API token at https://id.atlassian.com/manage-profile/security/api-tokens
| Variable | Default | What it does |
|---|---|---|
REV0_JIRA_URL | unset | Your Jira site, e.g. https://your-org.atlassian.net. This template sets it to https://your-org.atlassian.net. |
REV0_JIRA_EMAIL | unset | The email address of the Jira account the token belongs to. This template sets it to you@yourcompany.com. |
REV0_JIRA_TOKEN | unset | The Jira API token. This template sets it to your-api-token. |
GitHub integration (read-only via the gh CLI)
Section titled “GitHub integration (read-only via the gh CLI)”Surfaces GitHub threads where you have responsibility (review requests, comments on your PRs, mentions/assignments) as board tickets so an agent can pre-shoot the work. Auth uses your existing gh login (run gh auth login); no token here. NOTHING is ever pushed or commented: that is hard-blocked in ~/.claude/settings.json (permissions.deny for git push / gh pr comment|review|merge / gh issue comment). The per-repo checkout mapping is the github_repos board setting, which has no control in Settings: write it with PUT /config and the access token, as {"github_repos": [{"match": "owner/repo", "path": "/abs/clone"}]}. Without a match, REV0_GITHUB_REPOS_ROOT below is searched.
| Variable | Default | What it does |
|---|---|---|
REV0_GITHUB_AUTOSTART | 0 | Seeds the github_autostart board setting: 1 moves each new import straight to To Do as a command ticket that runs the pre-shoot skill in the repo’s local clone. Off lands them in the column picked in the import modal, like Jira and Slack. |
REV0_GITHUB_REPOS_ROOT | unset | Directory holding your local clones, used to find a repo’s checkout when no github_repos entry matches: tries <root>/<repo> then <root>/<owner>/<repo>. |
Slack import (read-only, paste-link)
Section titled “Slack import (read-only, paste-link)”A user token (xoxp-…) is recommended so it can read any conversation you belong to (incl. DMs and private channels) without adding a bot per channel. Scopes: channels:history, groups:history, im:history, mpim:history, users:read, files:read (files:read is required to import images and attachments).
| Variable | Default | What it does |
|---|---|---|
REV0_SLACK_TOKEN | unset | Slack token used to fetch the messages whose links you paste into the board. Separate from the outbound REV0_SLACK_WEBHOOK below. |
Notifications
Section titled “Notifications”| Variable | Default | What it does |
|---|---|---|
REV0_SLACK_WEBHOOK | unset | Slack incoming webhook the board posts ticket events to. |
REV0_SLACK_DUE_WEBHOOK | unset | A separate, private Slack incoming webhook used only for “your result is due” alerts. Point it at a channel or DM only you see. Unset sends no Slack due ping; the in-app bell and OS notification still fire. |
REV0_VAPID_CONTACT | mailto:kanban@localhost | The contact (a mailto: or https: URL) sent with browser push notifications, as the VAPID standard requires. The placeholder is fine for self-hosting. |
REV0_NOTIFICATION_MUTED_KINDS | progress | Seeds the muted notification kinds: a comma-separated list of kinds that never raise a notification. Empty mutes nothing. |
Runner / agent
Section titled “Runner / agent”| Variable | Default | What it does |
|---|---|---|
REV0_ASSIGNEE | claude-code | Only tickets assigned to this name are picked up by the runner. |
REV0_MODEL | unset | Seeds the board’s default model for every run; a per-ticket Model (create form, ticket detail, CLI --model, or the update_ticket MCP tool) overrides it. Any pinned model id works. Set this explicitly: headless runs do NOT inherit the model picked interactively via /model, and the account default may be a smaller model. Unset leaves the agent CLI’s own default. This template sets it to claude-opus-4-8. |
REV0_THINKING_LEVEL | unset | Seeds the board’s default reasoning level; a per-ticket Thinking level overrides it. Levels are each provider’s own effort names: off, low, medium, high, xhigh, max for Claude Code, plus minimal and ultra for Codex (config/thinking_levels.json says which models support which). A level a run’s model does not support is clamped down. Unset leaves the CLI’s own behaviour untouched. auto has every run rated instead (see below). |
REV0_THINKING_EVAL_MODEL | haiku | The model that rates each run’s task when a thinking level is set to auto, and picks the level that run uses. An alias or a model id on any engine; off skips the rating. |
REV0_ENGINE | claude | The engine that drives runs when neither the ticket nor its model picks one: claude, codex or cursor. A model id with a known prefix (gpt-, codex-) picks its engine by itself, so this is rarely needed. |
REV0_ENGINE_MODELS | unset | Path to the per-engine model config (default: config/engine_models.json), which maps model id prefixes to engines. |
REV0_CODEX_TRANSPORT | app-server | How the board drives the Codex CLI. app-server is the only transport with an approval channel, so it is the only one the permission gate can hold; exec is an escape hatch that runs ungated. |
REV0_MODELS | unset | Path to the curated model catalog the model dropdown shows (default: config/models.json). |
REV0_MODEL_SCRAPE | 1 | Set to 0 to stop discovering models from the installed agent CLIs; the dropdown then shows only the catalog. |
REV0_THINKING_LEVELS | unset | Path to the per-engine, per-model thinking level ladder (default: config/thinking_levels.json). |
REV0_THINKING_SCRAPE | 1 | Set to 0 to stop discovering thinking levels from the installed agent CLIs. |
REV0_MODEL_WINDOWS | unset | Path to the model to context window mapping (default: config/model_context_windows.json). |
REV0_MODEL_PROMPTING | unset | Path to the per-model system prompt append (default: config/model_prompting.json). |
REV0_CLI_PATH | unset | Which claude binary the board spawns. By default it picks the newest of claude on PATH, the newest native install under ~/.local/share/claude/versions, and the SDK’s bundled CLI, because a bundled CLI older than a model rejects that model before any API call. Set this only to pin a specific binary; it is read once, so a change needs a board restart. |
REV0_MAX_IDLE_RESUMES | 1 | How many times to auto-resume a run that ended still In Progress without calling finish_ticket or request_action (typically an agent that ended its turn waiting for a background task). After this many attempts the ticket escalates to a human. |
REV0_MAX_USAGE_LIMIT_RETRIES | 8 | How many times a run that hit a usage or session limit may wait for the quota reset and auto-resume before parking for a human. 0 parks immediately. |
REV0_MAX_TRANSIENT_RETRIES | 4 | Seeds how many times the runner auto-retries a run that failed on a transient model or API error (connection reset, timeout, 5xx, rate limit) before parking the ticket. Retries resume the saved session with exponential backoff. 0 parks immediately. |
REV0_TRANSIENT_BACKOFF_BASE | 2.0 | Seeds the base seconds of the transient retry backoff (wait is about base * 2^attempt, with jitter). |
REV0_TRANSIENT_BACKOFF_MAX | 30.0 | Seeds the cap, in seconds, on a single transient retry wait. |
REV0_AGENT_STALL_TIMEOUT | 300 | Seeds how long, in seconds, the runner waits on a silent agent CLI before treating the run as stalled and retrying it. Applies only while the CLI waits on the model API; a long tool call is never interrupted. |
REV0_RETRY_QUEUE_MAX_ATTEMPTS | 5 | For a ticket that opts into the retry queue: how many times a genuinely failed run is re-queued before it parks for good. |
REV0_RETRY_QUEUE_BACKOFF_BASE | 60 | For the retry queue: the first delay in seconds, doubled after each attempt and capped at one hour. |
REV0_COMPACT_ENABLED | unset | Set to 0 to never compact a session before resuming it. Unset follows config/model_context_windows.json, which enables it. The Settings value wins over both. |
REV0_COMPACT_THRESHOLD | unset | Fraction of the context window at which a resumed session is compacted before the real prompt is sent. Unset follows config/model_context_windows.json, then 0.75. |
REV0_MAX_BUFFER_SIZE | 20971520 | Largest single message, in bytes, the runner accepts from the agent CLI. The SDK’s own 1 MB default can kill a run on one wide diff or big file read. |
REV0_TOOL_RESULT_MAX_CHARS | 64000 | How many characters of each tool result are stored on the ticket. Anything past it is flagged as dropped rather than silently cut. |
REV0_MCP_MAX_FIELD_CHARS | 6000 | Long string fields in a ticket returned by the kanban MCP tools are clipped to this many characters. The web UI and REST API always see the full text. |
REV0_MCP_MAX_RESULT_CHARS | 40000 | Any single kanban MCP tool result larger than this many characters is cut, with a notice that says how to get the rest. |
REV0_FINAL_SUMMARY_ENABLED | 1 | Seeds the Agent final summary setting: 0 tells agents not to end a turn or a ticket with a recap of what they did. |
Token savers
Section titled “Token savers”| Variable | Default | What it does |
|---|---|---|
REV0_BASH_COMPRESS | 0 | Set to 1 to compress noisy Bash output before the model reads it: repeated lines collapse, whitespace is stripped and huge outputs keep their head and tail, while test failures are preserved. It only changes what the model sees, never what the command does. |
REV0_RTK_ENABLED | unset | Set to 1 to rewrite simple, allow-listed shell commands to their rtk equivalent so their output is filtered at the source. Unset follows config/rtk.json, then off. The Settings toggle wins over both. Install the binary with rev0 install-rtk. |
REV0_RTK_CONFIG | unset | Path to the rtk config (default: config/rtk.json). |
REV0_PONYTAIL_ENABLED | unset | Set to 1 to append the ponytail “lazy senior developer” rules to every agent’s system prompt. Unset follows config/ponytail.json, then off. The Settings toggle wins. |
REV0_PONYTAIL_LEVEL | unset | Seeds the ponytail intensity: lite, full or ultra. Unset follows config/ponytail.json, then full. |
REV0_PONYTAIL_CONFIG | unset | Path to the ponytail config (default: config/ponytail.json). |
Tools, skills and MCP
Section titled “Tools, skills and MCP”| Variable | Default | What it does |
|---|---|---|
REV0_BROWSER | 1 | Every agent run gets a real headless Chromium through the Playwright MCP server, so it can read JS-heavy and anti-bot pages WebFetch cannot. The safe browser_* tools are pre-approved; browser_file_upload and browser_run_code_unsafe still ask. Set to 0 to disable it, or override it with a playwright entry via REV0_MCP_CONFIG. |
REV0_COMPUTER_CHROME | unset | The Chrome binary for the ticket’s computer: the Chromium the board starts per ticket, in the default browser_session_mode “ticket”, for the agent to use and a human to watch and take over. Unset uses installed Google Chrome when present, else Playwright’s Chromium. |
REV0_MCP_CONFIG | unset | Path to a JSON file in Claude’s mcp.json format ({"mcpServers": {"name": {...}}}) listing extra MCP servers for every agent run, on top of the built-in kanban and browser servers. Their tools are not auto-approved. See config/extra_mcp.example.json. |
REV0_ALLOW_MCP_EDIT | 1 | Whether the MCP server list can be edited from Settings. A server’s command runs on the runner host, so set 0 to make the list read-only (REV0_MCP_CONFIG still works). |
REV0_PLUGIN_PATHS | unset | Seeds the external plugin folders, separated by the platform path separator (: on macOS and Linux). |
REV0_PLUGIN_CACHE | unset | Where the board clones repo plugin sources (default: ~/.rev0/plugins). |
REV0_SKILLS_CONFIG | unset | Path to the per-mode skill filter (default: config/skills.json). |
REV0_SKILL_PACKS_CONFIG | unset | Path to the skill pack manifest (default: config/skill_packs.json). |
REV0_AGENT_TOOLS_CONFIG | unset | Path to the built-in agent tool config (default: config/agent_tools.json). |
REV0_UI_KIT_ENABLED | 1 | Seeds the Reusable UI kit setting: steer agents to build visual deliverables from the ui-factory component library instead of hand-written HTML. |
REV0_UI_KIT_GUIDANCE | unset | Path to the UI kit guidance appended to agent prompts (default: config/ui_kit.json). |
REV0_HARNESSES | unset | Path to the agent CLI update config (default: config/harnesses.json). |
REV0_HARNESS_UPDATE | unset | Set to 1 or 0 to force updating the agent CLIs (claude, codex, cursor) on or off. Unset follows the Auto-update the agent CLIs setting (Settings > Agents > Model & thinking, on by default), which updates at startup and every 6 hours. |
REV0_HARNESS_CHANNEL | unset | The release channel the agent CLIs update from. Unset follows config/harnesses.json, then latest. |
Orchestration and Loops
Section titled “Orchestration and Loops”| Variable | Default | What it does |
|---|---|---|
REV0_ORCHESTRATOR_ENABLED | 1 | Seeds the Agent orchestration setting: give planning and top-level agents the orchestrator playbook, so they can fan independent work out into subtickets. 0 keeps every ticket a solo agent. |
REV0_ORCHESTRATOR_GUIDANCE | unset | Path to the orchestrator playbook (default: config/orchestrator.json). |
REV0_ORCHESTRATOR_WORKER_MODEL | sonnet | Seeds the model a fan-out subticket defaults to. Blank makes a child inherit its parent’s model. |
REV0_ORCHESTRATOR_MAX_CHILDREN | 6 | Seeds the advisory cap on how many parallel subtickets one orchestration fans out to. |
REV0_ORCH_SELF_APPROVAL | 0 | Seeds Orchestrator self-approval: 1 lets an orchestrator approve or correct the plans of its own subtickets without a human. |
REV0_ORCH_PERM_DELEGATION | 0 | Seeds Orchestrator permission delegation: 1 lets an orchestrator resolve its own subtickets’ permission requests, passing on only grants it already holds. |
REV0_DEFAULT_PLAN_TYPE | spa_plan | Seeds the default plan type agents produce when nothing names one: spa_plan, flow_plan or plan_required. |
REV0_LOOP_TRIGGERS | 1 | Set to 0 to stop polling for Loop event triggers. Only runs with the runner. |
REV0_LOOP_POLL_INTERVAL | 300 | Seconds between Loop event trigger polls. |
REV0_LOOP_RUN_ARCHIVE | end_of_day | Seeds when a finished Loop run leaves the board for its Loop’s History tab: immediately, end_of_day, never, or a number of minutes. |
REV0_LOOP_SCRIPT_SANDBOX | srt | Seeds how a Loop script node’s Python is isolated: srt (sandbox-runtime, falling back to a hardened subprocess when it is not installed) or off (in-process, not recommended). |
REV0_LOOP_SCRIPT_SANDBOX_NETWORK_DOMAINS | unset | Seeds the comma-separated domains a sandboxed Loop script node may reach. Empty denies all network access. |
REV0_WEBHOOK_SECRET | unset | The secret that signs per-Loop webhook trigger URLs. Unset falls back to REV0_AUTH_TOKEN; with neither set, webhooks are refused. |
Side questions and helper models
Section titled “Side questions and helper models”| Variable | Default | What it does |
|---|---|---|
REV0_BTW_MODEL | unset | Model that answers a side question asked on a ticket while its agent works. Unset uses the ticket’s model, then REV0_MODEL. |
REV0_BTW_MAX_TURNS | 12 | Most turns a side question may take. |
REV0_BTW_TIMEOUT_S | 300 | Wall-clock ceiling, in seconds, on one side question. |
REV0_BTW_MAX_CONCURRENT | 2 | Side questions in flight at once across all tickets. Separate from the agent cap, so a question never costs the board a work slot. |
REV0_CHAT_TITLE_MODEL | haiku | Model that writes chat titles. 0 or off turns titling off. |
REV0_DIAGRAM_MODEL | unset | Model for generated diagrams. Unset uses the ticket’s model, then REV0_MODEL. |
REV0_FLOW_MODEL | unset | Model for flow plan graphs. Unset uses REV0_DIAGRAM_MODEL, then the ticket’s model. |
REV0_SUBTASK_MAP_MODEL | unset | Model for Subtask Map explanations. Unset uses REV0_DIAGRAM_MODEL, then the root ticket’s model. |
REV0_SUBTASK_MAP_EXPLAIN | 0 | Seeds Subtask map explanations: 1 offers an LLM-written purpose for each subticket and a label for each arrow, generated when you click Explain. |
Parallel agents: git worktrees + branches
Section titled “Parallel agents: git worktrees + branches”| Variable | Default | What it does |
|---|---|---|
REV0_MAX_PARALLEL | 3 | Seeds how many tickets the runner works on at once, until setup runs: every setup profile writes 8 to Max concurrent agents (Settings > Workspace > Board), which then wins. Different repos are always safe; same-repo tickets run in isolated git worktrees, and the same non-git directory runs one ticket at a time. |
REV0_WORKTREE_ROOT | unset | Where per-ticket worktrees live. Unset uses a sibling <repo>.agent_worktrees directory. |
REV0_DEFAULT_WORKDIR | unset | Seeds the repo a ticket belongs to when neither it nor its parents name one (per board in Settings). Blank means such a ticket runs in scratch. |
REV0_SCRATCH_ROOT | unset | Where a ticket that belongs to no repo works: nothing to merge, deliverables on the board. Unset uses ~/.rev0/scratch. Must be outside every checkout. |
REV0_REPOS_ROOT | unset | Seeds the directory scanned one level deep for git repos, each offered as a quick-pick in a new ticket’s Working directory field. Blank turns the quick-pick off. |
REV0_BASE_BRANCH | unset | Branch the agent branches off when a ticket does not pick one. Unset auto-detects origin/HEAD, then main or master, then the current branch. |
REV0_DELETE_BRANCH_ON_MERGE | 1 | On a clean integration, delete the ticket branch. |
REV0_GITHUB_CREATE_PR | 0 | Default for the per-ticket “Open a GitHub PR” opt-in. Off means integration is local-only: merge the branch into its base, no PR. A ticket’s own flag also enables it. |
REV0_GITHUB_AUTO_MERGE | 0 | Default for the per-ticket auto-merge opt-in: merge the GitHub PR without a review. Only has an effect when a PR is being opened. |
REV0_PR_MERGE_METHOD | merge | How auto-merged PRs are merged: merge, squash or rebase. |
REV0_MAX_CONFLICT_ATTEMPTS | 2 | How many times the runner lets an agent try to resolve a merge conflict before the ticket parks for a human. |
REV0_CONFLICT_MAX_TURNS | 40 | Most turns one conflict-resolution run may take. |
REV0_MAX_DIRTY_RETRIES | 10 | How many integration passes (one per poll) a requested merge may wait on a base branch with uncommitted changes before it escalates to a human. |
REV0_GIT_NAME | unset | Seeds the name agents commit as. Unset falls back to your global git identity, else rev0. |
REV0_GIT_EMAIL | unset | Seeds the email agents commit as. Unset falls back to your global git identity, else rev0@local. |
Permissions
Section titled “Permissions”| Variable | Default | What it does |
|---|---|---|
REV0_CMD_POLICY | safe | safe runs any command that is not flagged dangerous, and only dangerous ones ask. allowlist runs only allow-listed commands, and everything else asks. |
REV0_ALLOWED_CMD_PREFIXES | unset | A JSON array of command prefixes that REPLACES the built-in safe baseline (uv, git status, npm, …). A value saved in Settings wins over it. |
REV0_DANGEROUS_CMD_PATTERNS | unset | A JSON array that REPLACES the built-in dangerous command patterns. Each entry is a regex, a [regex, reason] pair or a [regex, reason, highlight_regex] triple. A malformed value falls back to the defaults. |
REV0_DANGEROUS_CMD_DISABLE | 0 | Set to 1 to turn dangerous command detection off entirely. Not recommended. |
REV0_CHILD_ENV_ALLOWLIST | 0 | Seeds Allow-list the agent’s environment: 1 builds every agent process’s environment from an allow-list instead of inheriting the board’s, dropping its API token, Jira and Slack tokens and SSH_AUTH_SOCK. |
REV0_CHILD_ENV_PASSTHROUGH | unset | Seeds the comma-separated variable NAMES to keep on top of that allow-list, such as SSH_AUTH_SOCK or GH_TOKEN. |
Spend budgets
Section titled “Spend budgets”| Variable | Default | What it does |
|---|---|---|
REV0_BUDGET_ENFORCEMENT | 0 | Seeds Enforce spend budgets: 1 parks a ticket in Pending Action before a turn once a ceiling below is exceeded. |
REV0_BUDGET_DAILY_USD | 400 | Seeds the ceiling, in US dollars, on agent spend since 00:00 UTC. 0 disables it. |
REV0_BUDGET_WEEKLY_USD | 2000 | Seeds the ceiling on spend since Monday 00:00 UTC. 0 disables it. |
REV0_BUDGET_MONTHLY_USD | 6000 | Seeds the ceiling on spend since the 1st of the month (UTC). 0 disables it. |
Remote access from your phone
Section titled “Remote access from your phone”| Variable | Default | What it does |
|---|---|---|
REV0_AUTH_TOKEN | unset | Shared secret that gates the board when you expose it beyond localhost (for example serve --host 0.0.0.0 for a phone on your Wi-Fi or tailnet). It turns on a one-time cookie login at /login, and the CLI, MCP server and runner pick it up automatically. Unset and bound to localhost, the board stays open with zero config. Generate one: python -c “import secrets;print(secrets.token_urlsafe(32))” |
REV0_ALLOW_INSECURE | 0 | Set to 1 to start on a non-loopback host with no REV0_AUTH_TOKEN, which is otherwise refused. A loud warning is logged on every start. |
REV0_TAILSCALE_HTTPS | unset | How the board uses Tailscale for HTTPS: serve (private tailnet HTTPS), funnel (public HTTPS, requires REV0_AUTH_TOKEN) or off. Unset uses serve when bound off loopback and does nothing on localhost. |
Public sharing
Section titled “Public sharing”| Variable | Default | What it does |
|---|---|---|
REV0_ARTIFACT_SHARE | 0 | Seeds Allow sharing artifacts publicly: 1 shows the Share publicly and Public link controls. |
REV0_ARTIFACT_SHARE_TUNNEL | manual | Seeds the public reachability provider: tailscale, cloudflared, ngrok or manual. |
REV0_ARTIFACT_SHARE_BASE_URL | unset | Seeds the public base URL used with the manual provider. |
Board display
Section titled “Board display”| Variable | Default | What it does |
|---|---|---|
REV0_BOARD_NAME | unset | Seeds what the board calls itself when it writes on a ticket. Unset uses the name generated when the board was created; blank in Settings resets it to “board”. |
REV0_USER_NAME | unset | Seeds what agents call you. Blank addresses you impersonally. |
REV0_APP_SPACE | 1 | Seeds App Space, the top bar gallery of reusable single-page tools. |
REV0_KB | 1 | Seeds the Knowledge Base app. |
REV0_DEBUG_TOOLS | 0 | Seeds Debug tools, for people working on the board itself. |
REV0_UPDATE_CHECK | 1 | Seeds the update check: every 6 hours the board downloads the release manifest to see whether a newer release is out. 0 turns it off. |
REV0_UPDATE_URL | https://github.com/cpc-studio/rev0-releases/releases/latest/download/latest.json | Where the update check finds the release manifest, latest.json. Change it only to serve releases from your own mirror; it must be HTTPS. |
REV0_SPEND_PILL | 1 | Seeds the spend readout in the usage popover. |
REV0_USAGE_METERS | 1 | Seeds the Claude and Codex rate limit meters. |
REV0_TOKENMAXXING_BAR | 0 | Seeds the context window usage bar on cards and in the ticket view. |
REV0_COLUMN_PAGE_SIZE | 50 | Seeds how many cards a column renders before revealing the rest as you scroll. |
REV0_TIMELINE_COLLAPSE | none | Seeds which indented timeline levels start folded: none, machinery or indented (every indented level). |
REV0_ACTIVITY_RETENTION_DAYS | 0 | Seeds how many days the raw agent transcript of a finished ticket is kept. Comments, plans and status history are never deleted. 0 keeps everything. |
REV0_WORKSPACE_RETENTION_DAYS | 0 | Seeds how many idle days before a ticket’s workspace is cleaned automatically, with the same rules as the Storage section’s Clean selected. 0 never cleans automatically. |
REV0_WORKSPACE_CLEAN_ON_MERGE | ask | Seeds what happens to a ticket’s worktree once its branch merges: ask, instant or days. |
REV0_SLICER_OPEN_ENABLED | 1 | Seeds the Open in Bambu Studio and Send to printer buttons on 3D model artifacts. |
REV0_SLICER_APP | Bambu Studio | Seeds the app a raw 3D model opens in, such as OrcaSlicer. |
REV0_STT_MODEL | faster-whisper/base | Seeds the local speech-to-text model used for voice input. |
REV0_STT_LANGUAGE | en | Seeds the language spoken into the mic: en, fr, or empty to auto-detect. |
Frontend build
Section titled “Frontend build”static/ (the served UI bundle) is build output and is not committed to git. When it is missing, serve builds it on startup: npm install (only if frontend/node_modules is absent) then npm run deploy. If npm is unavailable or a step fails, it serves a placeholder page instead.
| Variable | Default | What it does |
|---|---|---|
REV0_BUILD_ON_STARTUP | 1 | 1 builds only when static/ is missing, 0 never builds (CI, or a deploy pipeline that builds out of band), force rebuilds on every startup (same as serve --rebuild). |
Deploy / container
Section titled “Deploy / container”| Variable | Default | What it does |
|---|---|---|
CLAUDE_CODE_OAUTH_TOKEN | unset | Claude Code auth for the runner when there is no interactive claude login (hosted, containers). Get one with claude setup-token on a machine where you are signed in. Subscription auth: no ANTHROPIC_API_KEY needed. |
REV0_DATA_ROOT | unset | Where the complete runtime tree lives: database, uploads, scratch, plugin clones, background jobs and .env. Unset uses ~/.rev0; the Docker image sets /data. See deploy/DEPLOY.md. |
Storage and misc
Section titled “Storage and misc”| Variable | Default | What it does |
|---|---|---|
REV0_DB | unset | Path to the SQLite database. Unset uses rev0.db in the data root. |
REV0_BGJOBS_DIR | unset | Where background task logs and exit files live. Unset uses background_jobs in the data root. |
REV0_API | http://127.0.0.1:8000 | The board URL the CLI, MCP server and runner talk to. |