Skip to content

Configuration reference

Configuration lives in .aiur/config (YAML); legacy .aiurconfig is also accepted. prompt_file: and hooks_file: point at sibling files. Supported secret and workspace-root fields resolve ~ and $VAR values; other path fields do not generally expand environment references.

Top-level

KeyTypeDefaultControls
max_vertical_panesinteger3Caps visible agent chat panes.
pre_warmed_sessionsinteger3Number of opencode sessions booted early; 0 disables pre-warm.
max_log_history_mbinteger1000Caps persistent log history in MB.
prompt_filestringnilPer-repository Liquid prompt template.
debugbooleanfalseEnables file logging without the CLI debug flag.
hooks_filefile pointerSibling YAML file merged as the hooks: block.

tracker

KeyTypeDefaultControls
tracker.kindstringSelects linear, github, or memory.
tracker.base_branchstringrepo defaultBranch agents target with PRs.
tracker.active_statesarraytracker-specificStates eligible for dispatch. GitHub values are lifecycle label slugs such as todo and in-progress, not display names.
tracker.terminal_statesarraytracker-specificStates that stop work. GitHub values are lifecycle label slugs such as done.
tracker.github.repostringGitHub owner/name used by Aiur.
tracker.github.label_prefixstringagentPrefixes lifecycle labels.
tracker.github.bot_accountstringnilLogin identity Aiur recognizes as its own to suppress self-triggered comment/event loops. This is an identity, not the credential: GITHUB_TOKEN is the credential Aiur authenticates with. aiur init defaults it to the token's login; prefer a dedicated bot account when operators also comment from a trusted CODEOWNER account. In a non-interactive or --force run the wizard applies the detected token login, or omits the key entirely when no login can be detected. Re-running aiur init preserves an existing value.
tracker.github.trusted_accountsarray[]Usernames allowed to direct agents.
tracker.linear.api_keystringenv fallbackLinear API key; $VAR resolves from the environment.
tracker.linear.project_slugstringnilLinear project polled by Aiur.
tracker.linear.endpointstringhttps://api.linear.app/graphqlLinear GraphQL endpoint.
tracker.linear.assigneestringenv fallbackLinear assignee filter.

polling

KeyTypeDefaultControls
polling.interval_secondsinteger30Seconds between tracker polls.

workspace

KeyTypeDefaultControls
workspace.rootstring pathtmp aiur_workspacesRoot for agent workspaces.
workspace.bootstrap_imagestringnilDocker image for warm build-cache seeding.
workspace.bootstrap_image_pullbooleanfalsePulls the bootstrap image before seeding.

worker

KeyTypeDefaultControls
worker.ssh_hostsarray[]SSH hosts available for remote execution.
worker.max_concurrent_agents_per_hostinteger or nilnilPer-host concurrent-agent cap.

agent

KeyTypeDefaultControls
agent.kindstringclaudeDefault coding backend; an explicit value wins, otherwise a claude: section infers claude, a codex: section infers codex, and no backend section falls back to claude.
agent.remote_controlbooleanfalseOpts RC-capable backends into remote control.
agent.max_concurrent_agentsinteger10Global simultaneous-agent cap.
agent.max_concurrent_buildsinteger2Caps local agent Mix verification; 0 deliberately disables the concurrency cap.
agent.build_start_stagger_secondsinteger0Minimum spacing between local Mix build starts; 0 disables pacing.
agent.min_free_memory_mbinteger or nilnilLinux MemAvailable floor shared by dispatch and the Mix build gate.
agent.max_concurrent_agents_by_statemap%{}Per-state caps overriding the global cap.
agent.routingmap%{}Maps complexity levels to backend/model/effort routing.
agent.switch_model_on_ratelimitarray[]Opt-in backend order for a new claim when a model is rate-limited.
agent.rate_limit_fallbackstringclaudeAutomatic recovery backend for an already-running Codex agent; "" disables it.
agent.complexity_promptsmap%{}Adds prompt guidance by complexity level.
agent.max_turnsinteger or nilnilPer-issue turn cap; nil is uncapped.
agent.max_retry_attemptsinteger3Failed-turn retry count.
agent.max_retry_backoff_msinteger300000Retry backoff ceiling in milliseconds.
agent.turn_timeout_msinteger3600000Backstop timeout for one turn.
agent.stall_timeout_msinteger3600000Silent-agent watchdog; 0 disables it.
agent.max_agent_duration_minutesinteger60Active-runtime pause checkpoint; 0 disables it.
agent.ci_wait_rewake_minutespositive integer5Re-wakes a CI-wait-paused agent for one recovery check when no terminal event arrives.
agent.max_load_averagefloat1.5Holds dispatch above the load threshold; null disables it.
agent.target_load_averagefloat1.0Adaptive per-scheduler load target; null disables the adaptive envelope.
agent.load_ramp_stepinteger1Capacity increase while load is below the target.
agent.load_cooldown_secondsinteger60Minimum interval between adaptive capacity reductions.
agent.synthetic_load_process_capinteger or nilnilCaps synthetic load processes; 0 disables the guard.
agent.mix_scheduler_capinteger or nilnilCaps schedulers in agent-launched Mix BEAMs; nil leaves them uncapped.

Enabled local Codex workspaceWrite turns preserve configured/workspace/Git roots and also grant the canonical shared build-gate metadata directory. Host-prepared lock inodes live in a sibling .locks directory that is excluded from turn-writable roots, preventing a sandbox from replacing a held slot. Gate coordination failures return status 125 without running Mix. Repair the reported metadata/lock directory, flock, or python3 subreaper dependency and restart/re-dispatch agents. If aiur status reports BUILD GATE DEGRADED, first stop the old fleet and confirm no old Mix verification is live, then clear only the reported legacy records. To disable build admission completely, set agent.max_concurrent_builds: 0, set agent.build_start_stagger_seconds: 0, and omit agent.min_free_memory_mb. This explicit opt-out removes every build safeguard; it is never an automatic error fallback.

agent.claude

KeyTypeDefaultControls
agent.claude.commandstringaiur-claudeCommand launching the Claude backend.
agent.claude.modelstring or nilnilOptional Claude model override.
agent.claude.permission_modestringbypassPermissionsClaude permission mode.

agent.codex

KeyTypeDefaultControls
agent.codex.commandstringcodex app-serverCommand launching the Codex app server.
agent.codex.approval_policystringuntrustedRuntime policy: untrusted, on-failure, on-request, granular, or never.
agent.codex.thread_sandboxstringworkspace-writeThread sandbox mode.
agent.codex.turn_sandbox_policymap or nilnilExplicit per-turn sandbox policy.
agent.codex.read_timeout_msinteger5000Codex app-server read timeout.
agent.codex.thrash_max_per_windowinteger6Rapid restart limit per window.
agent.codex.thrash_window_secondsinteger60Thrash-counting sliding window.

hooks

KeyTypeDefaultControls
hooks.after_createstring or nilnilCommand after workspace creation.
hooks.before_runstring or nilnilCommand before each agent run.
hooks.after_runstring or nilnilCommand after each agent run.
hooks.before_removestring or nilnilCommand before workspace removal.
hooks.timeout_msinteger600000Per-hook timeout; 10 minutes by default.

prewarm

KeyTypeDefaultControls
prewarm.enabledbooleanfalseOpts into one warm base checkout.
prewarm.base_buildstringOne-time base build command.
prewarm.base_build_filestringSibling script loaded into base_build.
prewarm.poll_secondsinteger0Base-refresh interval; 0 disables polling.

pr_watch

KeyTypeDefaultControls
pr_watch.enabledbooleanfalseEnables trusted PR comment watching.
pr_watch.watch_labelstringwatchLabel suffix enrolling a PR for watching.
pr_watch.command_prefixstring/aiurOne-off trusted comment command prefix.

events

KeyTypeDefaultControls
events.block_state_debounce_secondsinteger10Debounces blocked/unblocked transitions.
events.custom_events_per_turn_maxinteger5Caps custom events per turn.
events.codeowners_refresh_secondsinteger3600CODEOWNERS refresh interval.

alerts

KeyTypeDefaultControls
alerts.enabledbooleantrueMaster alert-sound switch.
alerts.use_os_default_soundsbooleanfalseUses built-in OS sounds by category.
alerts.sound_dirstring path or nilnilDirectory for custom sound files.
alerts.alerts_filestring path or nilbundled alerts fileTopic-to-sound YAML map.

observability

KeyTypeDefaultControls
observability.dashboard_enabledbooleantrueReserved compatibility setting; use the launch-time --no-dashboard flag to suppress the listener in foreground or background mode.
observability.dashboard_writablebooleanfalseEnables dashboard write paths.
observability.refresh_msinteger1000Dashboard data refresh interval.
observability.render_interval_msinteger16Minimum render interval.

dashboard_writable is an authorization gate, not an authentication mechanism. Writable or non-loopback dashboards also require AIUR_DASHBOARD_USERNAME and AIUR_DASHBOARD_PASSWORD. The supervising-Executor Decision API uses the separate AIUR_SUPERVISOR_TOKEN bearer credential.

decisions

KeyTypeDefaultControls
decisions.supervisor_allowed_kindsarray[]Decision kinds an authenticated supervising Executor may answer. Empty means none.
decisions.supervisor_allow_non_reversiblebooleanfalseAllows supervisor policy to cover partially reversible or irreversible decisions.

These policy keys never grant transport access by themselves. The supervisor API also requires AIUR_SUPERVISOR_TOKEN; mutations require the writable and origin gates described above.

server

KeyTypeDefaultControls
server.portinteger0HTTP port; 0 selects a free OS port.
server.hoststring127.0.0.1HTTP bind address.

opencode

KeyTypeDefaultControls
opencode.commandstringopencodeCommand launching opencode.
opencode.bridge_portinteger4097Aiur↔opencode bridge port.
opencode.bridge_hoststring127.0.0.1Aiur↔opencode bridge host.
opencode.serve_argsarray[]Extra opencode serve arguments.
opencode.model_prefixstringaiurPrefix for registered synthetic models.
opencode.prewarm_disabledbooleanfalseDisables opencode session pre-warming.

Resolution & validation notes

  • An unset or blank prompt_file falls back to the built-in default prompt; a configured unreadable path fails startup.
  • A legacy top-level linear: section is merged into tracker.linear.
  • Only $VAR environment references resolve; legacy env:NAME values remain literal.
  • polling.interval_ms is rejected by the loader; use interval_seconds.

Command macro, delegate micro, maximize APM.