Configuration Reference
Complete reference for ~/.ashlr/ashlr.yaml, environment variables, and backend configuration.
Config File Location
Ashlr AO stores its configuration at ~/.ashlr/ashlr.yaml. This file is auto-created on first run with sensible defaults. You can edit it manually or update it through the dashboard settings (Cmd+,) or the PUT /api/config endpoint.
Full Config Reference
Below is the complete ashlr.yaml with all available options and their defaults:
# ~/.ashlr/ashlr.yaml
server:
host: "127.0.0.1" # Bind address (use 0.0.0.0 for Docker)
port: 5111 # HTTP port
log_level: "INFO" # DEBUG, INFO, WARNING, ERROR
agents:
max_concurrent: 16 # Max simultaneous agents (clamped by license)
default_role: "general" # Default role for new agents
default_working_dir: "~/Projects" # Default working directory
output_capture_interval_sec: 1.0 # tmux capture frequency (seconds)
memory_limit_mb: 2048 # Per-agent memory limit (MB)
default_backend: "claude-code" # Default backend (claude-code|codex|aider|goose)
backends:
claude-code:
command: "claude"
args: ["--dangerously-skip-permissions"]
codex:
command: "codex"
args: []
aider:
command: "aider"
args: []
goose:
command: "goose"
args: []
llm:
enabled: false # Enable intelligence layer
provider: "xai" # LLM provider
model: "grok-4-1-fast-reasoning" # Model name
api_key_env: "XAI_API_KEY" # Env var holding the API key
base_url: "https://api.x.ai/v1" # API base URL
summary_interval_sec: 10.0 # Agent summary generation interval
meta_interval_sec: 30.0 # Fleet analysis interval
voice:
enabled: true # Enable push-to-talk voice input
ptt_key: "Space" # Push-to-talk key binding
licensing:
key: "" # JWT license key (set via API or YAML)
auto_pilot:
auto_restart_on_stall: false # Auto-restart stalled agents
auto_approve_enabled: false # Enable pattern-based auto-approve
auto_approve_patterns: [] # Regex patterns to auto-approve
auto_pause_on_critical_health: false # Pause agents on critical health
file_lock_enforcement: false # Prevent concurrent edits to same file
display:
theme: "dark" # dark or light
cards_per_row: 4 # Agent cards per grid row
Server Settings
| Option | Type | Default | Description |
|---|---|---|---|
server.host | string | "127.0.0.1" | IP address to bind the HTTP server. Use "0.0.0.0" to accept connections from all interfaces (required for Docker). |
server.port | integer | 5111 | HTTP port number. Can be overridden with ASHLR_PORT env var. |
server.log_level | string | "INFO" | Python logging level. One of: DEBUG, INFO, WARNING, ERROR. |
Agent Settings
| Option | Type | Default | Description |
|---|---|---|---|
agents.max_concurrent | integer | 16 | Maximum number of agents that can run simultaneously. Effective limit is min(config, license) — Community tier caps at 5, Pro at up to 100. |
agents.default_role | string | "general" | Default role assigned to new agents. One of: frontend, backend, devops, tester, reviewer, security, architect, docs, general. |
agents.default_working_dir | string | "~/Projects" | Default working directory for new agents. Must be under ~/ or /tmp. |
agents.output_capture_interval_sec | float | 1.0 | How often (in seconds) Ashlr captures tmux pane output. Lower values mean more responsive status updates but higher CPU usage. |
agents.memory_limit_mb | integer | 2048 | Per-agent memory limit in megabytes. The memory watchdog background task checks this every 10 seconds. |
agents.default_backend | string | "claude-code" | Default backend for new agents. One of: claude-code, codex, aider, goose. |
Backend Configuration
Each backend defines the CLI command and default arguments used to spawn agents:
claude-code
agents:
backends:
claude-code:
command: "claude"
args: ["--dangerously-skip-permissions"]
Claude Code supports additional per-agent options at spawn time:
- Plan mode — Replaces
--dangerously-skip-permissionswith--permission-mode plan - Model selection — Adds
--model <model-name>flag - Tool restriction — Adds
--allowedTools <tool-list>flag - Stream-json mode — Uses
--print --output-format stream-jsoninstead of tmux (non-interactive)
codex
agents:
backends:
codex:
command: "codex"
args: []
aider
agents:
backends:
aider:
command: "aider"
args: []
goose
agents:
backends:
goose:
command: "goose"
args: []
Custom backends: You can add any CLI-based tool as a backend by adding an entry under agents.backends with a command and args. The tool must accept input via stdin and produce output on stdout.
Intelligence (LLM) Settings
| Option | Type | Default | Description |
|---|---|---|---|
llm.enabled | boolean | false | Enable the intelligence layer. Requires XAI_API_KEY environment variable. |
llm.provider | string | "xai" | LLM provider identifier. |
llm.model | string | "grok-4-1-fast-reasoning" | Model name for the LLM API. |
llm.api_key_env | string | "XAI_API_KEY" | Name of the environment variable containing the API key. |
llm.base_url | string | "https://api.x.ai/v1" | Base URL for the OpenAI-compatible API endpoint. |
llm.summary_interval_sec | float | 10.0 | How often (in seconds) to generate LLM summaries for active agents. |
llm.meta_interval_sec | float | 30.0 | How often (in seconds) to run fleet-wide analysis (conflict detection, stuck agents, handoff recommendations). |
Voice Settings
| Option | Type | Default | Description |
|---|---|---|---|
voice.enabled | boolean | true | Enable browser-native push-to-talk voice input using the Web Speech API. |
voice.ptt_key | string | "Space" | Key binding for push-to-talk. Hold to activate, release to stop. |
Auto-Pilot Settings
| Option | Type | Default | Description |
|---|---|---|---|
auto_pilot.auto_restart_on_stall | boolean | false | Automatically restart agents that have stalled (no output for extended period). |
auto_pilot.auto_approve_enabled | boolean | false | Enable automatic approval of agent questions that match safe patterns. |
auto_pilot.auto_approve_patterns | list | [] | Regex patterns to auto-approve. Example: ["proceed with.*changes", "apply.*fix"] |
auto_pilot.auto_pause_on_critical_health | boolean | false | Pause agents when system health becomes critical (high memory or CPU pressure). |
auto_pilot.file_lock_enforcement | boolean | false | Prevent multiple agents from editing the same file simultaneously. Agents receive a warning but are not blocked by default. |
Safety: Auto-approve has a hardcoded never-approve list that blocks dangerous commands like rm -rf, git push --force, DROP TABLE, etc. There is also a rate limit of 5 auto-approvals per minute per agent.
Display Settings
| Option | Type | Default | Description |
|---|---|---|---|
display.theme | string | "dark" | Dashboard color theme. Either "dark" or "light". |
display.cards_per_row | integer | 4 | Number of agent cards per row in the grid layout. |
Licensing
| Option | Type | Default | Description |
|---|---|---|---|
licensing.key | string | "" | Ed25519-signed JWT license key. Set via POST /api/license/activate or directly in YAML. Empty string means Community tier. |
Environment Variables
Environment variables override config file values where applicable:
| Variable | Required | Default | Description |
|---|---|---|---|
XAI_API_KEY | No | — | API key for xAI Grok. Enables all intelligence features: agent summaries, NLU command parsing, and fleet analysis. |
ASHLR_PORT | No | 5111 | Override the HTTP port. Takes precedence over server.port in config. |
ASHLR_HOST | No | 127.0.0.1 | Override the bind address. Takes precedence over server.host in config. |
ASHLR_ALLOWED_ORIGINS | No | * | CORS allowed origin. Set to your domain in production (e.g., https://ashlr.yourdomain.com). |
CLAUDECODE | No | — | Set to any value to enable demo mode. Agents are simulated without real CLI backends. Useful for development and testing. |
Updating Config at Runtime
You can update configuration without restarting the server:
Via the Dashboard
Open Settings (Cmd+,) to modify agent limits, backend settings, auto-pilot options, and display preferences. Changes are saved to YAML and applied to the running server immediately.
Via the API
curl -X PUT http://127.0.0.1:5111/api/config \
-H "Content-Type: application/json" \
-d '{
"agents": {
"max_concurrent": 10,
"default_backend": "claude-code"
},
"auto_pilot": {
"auto_restart_on_stall": true
}
}'
The server validates the update, merges it with the current config, writes to ~/.ashlr/ashlr.yaml, and applies changes to the running process. If auth is enabled, only admin users can update the config.
Note: The max_concurrent value is always clamped to the license ceiling. On Community tier, even if you set max_concurrent: 100, the effective limit will be 5.
Background Tasks
Ashlr runs 6 supervised background tasks that are configured implicitly by the settings above:
| Task | Interval | Purpose |
|---|---|---|
| Output capture | 1s (output_capture_interval_sec) | Captures tmux pane output, detects status, generates summaries |
| Metrics | 2s | CPU, memory, per-agent resource tracking |
| Health check | 5s | Stall detection, hung agent detection, memory pressure |
| Memory watchdog | 10s | Per-agent memory limits (memory_limit_mb), system pressure response |
| Meta-agent | 30s (meta_interval_sec) | LLM fleet analysis (requires intelligence layer) |
| Archive cleanup | 1hr | Purges archived agent records older than 48 hours |
All background tasks are supervised with automatic restart on failure.
Edit this page on GitHub