# Database (OPTIONAL) # Default: SQLite at ~/.archon/archon.db (no setup required) # Recommended: PostgreSQL for heavy parallel usage (20+ concurrent workflows) # docker compose --profile with-db up -d # Uncomment for PostgreSQL: # DATABASE_URL=postgresql://postgres:postgres@localhost:5432/remote_coding_agent # AI Assistants # Claude Auth Options: # - CLAUDE_USE_GLOBAL_AUTH=true: Use global auth from `claude /login` (recommended) # - CLAUDE_USE_GLOBAL_AUTH=false: Use explicit tokens below # - Not set: Auto-detect (use tokens if present, otherwise global auth) CLAUDE_USE_GLOBAL_AUTH=true # CLAUDE_CODE_OAUTH_TOKEN=... # CLAUDE_API_KEY=... # Claude Code executable path (REQUIRED for compiled Archon binaries) # Archon does not bundle Claude Code — install it separately and point us at it. # Dev mode (`bun run`) auto-resolves via node_modules. # Alternatively, set `assistants.claude.claudeBinaryPath` in ~/.archon/config.yaml. # # Install (Anthropic's recommended native installer): # macOS/Linux: curl -fsSL https://claude.ai/install.sh | bash # Windows: irm https://claude.ai/install.ps1 | iex # # Then: # CLAUDE_BIN_PATH=$HOME/.local/bin/claude (native installer) # CLAUDE_BIN_PATH=$(npm root -g)/@anthropic-ai/claude-code/cli.js (npm alternative) # CLAUDE_BIN_PATH= # Codex Authentication (get from ~/.codex/auth.json after running 'codex login') # Required if using Codex as AI assistant # On Linux/Mac: cat ~/.codex/auth.json # On Windows: type %USERPROFILE%\.codex\auth.json CODEX_ID_TOKEN= CODEX_ACCESS_TOKEN= CODEX_REFRESH_TOKEN= CODEX_ACCOUNT_ID= # CODEX_BIN_PATH= # Optional: path to Codex native binary (binary builds only) # Pi (community provider — @mariozechner/pi-coding-agent) # One adapter, ~20 LLM backends. Archon's Pi adapter picks up credentials # you've already configured via the Pi CLI (`pi /login` writes to # ~/.pi/agent/auth.json), plus these env vars for backends you haven't # logged into via OAuth. Env vars override auth.json per-request. # # Use by setting `provider: pi` and `model: /` in # workflow YAML or `.archon/config.yaml` (e.g. model: google/gemini-2.5-pro). # # ANTHROPIC_API_KEY= # Pi provider id: anthropic # OPENAI_API_KEY= # Pi provider id: openai # GEMINI_API_KEY= # Pi provider id: google # GROQ_API_KEY= # Pi provider id: groq # MISTRAL_API_KEY= # Pi provider id: mistral # CEREBRAS_API_KEY= # Pi provider id: cerebras # XAI_API_KEY= # Pi provider id: xai # OPENROUTER_API_KEY= # Pi provider id: openrouter # HUGGINGFACE_API_KEY= # Pi provider id: huggingface # # Docker (optional): Pi data (auth, models, settings, sessions) lives in the # container's ~/.pi/agent/ and is lost on rebuild. Set PI_CODING_AGENT_DIR to # a path inside /.archon/ so it lands on the persisted volume. Must be set # before the container starts (Pi reads it on each file path lookup). # PI_CODING_AGENT_DIR=/.archon/pi # Default AI Assistant (must match a registered provider, e.g. claude, codex, pi) # Used for new conversations when no codebase specified — errors on unknown values DEFAULT_AI_ASSISTANT=claude # Title Generation Model (optional) # Model used for generating conversation titles (lightweight task) # When unset, uses the SDK's default model # Examples: haiku, gpt-4o-mini, claude-haiku-4-5 # TITLE_GENERATION_MODEL=haiku # GitHub Token (for GitHub CLI and commands) GH_TOKEN= GITHUB_TOKEN= # Same as GH_TOKEN, used by adapter # GitHub Webhooks WEBHOOK_SECRET= # GitHub User Whitelist (optional - comma-separated usernames) # When set, only listed GitHub users can trigger webhook processing # When empty/unset, webhooks are processed for all users # Usernames are case-insensitive (octocat == Octocat) GITHUB_ALLOWED_USERS= # GitLab Webhooks (Community Forge Adapter) # GITLAB_URL=https://gitlab.com # Or self-hosted: https://gitlab.example.com GITLAB_TOKEN= # Personal/Project Access Token with 'api' scope GITLAB_WEBHOOK_SECRET= # Secret token set in GitLab webhook configuration # GITLAB_ALLOWED_USERS= # Optional: comma-separated GitLab usernames # GITLAB_BOT_MENTION=archon # Optional: @mention name for detection (default: BOT_DISPLAY_NAME) # Platforms - set the tokens for the ones you want to use # Telegram - TELEGRAM_BOT_TOKEN= # Discord - DISCORD_BOT_TOKEN= # Slack Bot (Socket Mode) # Create app at https://api.slack.com/apps - see docs/slack-setup.md SLACK_BOT_TOKEN= SLACK_APP_TOKEN= # Slack User Whitelist (optional - comma-separated user IDs) # When set, only listed Slack users can interact with the bot # When empty/unset, bot responds to all users # Get user IDs: Slack profile > ... > Copy member ID SLACK_ALLOWED_USER_IDS= # Discord User Whitelist (optional - comma-separated user IDs) # When set, only listed Discord users can interact with the bot # When empty/unset, bot responds to all users # Get user IDs in Discord: Settings > Advanced > Developer Mode, then right-click user > Copy ID DISCORD_ALLOWED_USER_IDS= # Telegram User Whitelist (optional - comma-separated user IDs) # When set, only listed Telegram users can interact with the bot # When empty/unset, bot responds to all users # Get your user ID by messaging @userinfobot on Telegram TELEGRAM_ALLOWED_USER_IDS= # Platform Streaming Mode (stream | batch) TELEGRAM_STREAMING_MODE=stream # stream (default) | batch DISCORD_STREAMING_MODE=batch # batch (default) | stream SLACK_STREAMING_MODE=batch # batch (default) | stream # Bot Display Name (shown in batch mode "starting" message) # Default: Archon # BOT_DISPLAY_NAME=Archon # GitHub Bot Mention (optional - for @mention detection in GitHub issues/PRs) # When set, the bot will respond to this @mention in issues/PRs # If not set, falls back to BOT_DISPLAY_NAME # GITHUB_BOT_MENTION=archon # ============================================ # Gitea (Community Forge Adapter) # ============================================ # Self-hosted Gitea instance URL GITEA_URL= # e.g. https://gitea.example.com # Gitea Token (for API access and authenticated clones) GITEA_TOKEN= # Personal access token or bot account token # Gitea Webhook Secret (set this in your Gitea webhook configuration) GITEA_WEBHOOK_SECRET= # Gitea User Whitelist (optional - comma-separated usernames) # When set, only listed Gitea users can trigger webhook processing # When not set, all users can trigger (open access mode) GITEA_ALLOWED_USERS= # Gitea Bot Mention (optional - for @mention detection in Gitea issues/PRs) # If not set, falls back to BOT_DISPLAY_NAME then config.botName # GITEA_BOT_MENTION=archon # Server # PORT=3090 # Default: 3090. Uncomment to override — must match between server and Vite proxy. # HOST=0.0.0.0 # Bind address (default: 0.0.0.0). Set to 127.0.0.1 to restrict to localhost only. # Cloud Deployment (for --profile cloud with Caddy reverse proxy) # Set your domain and point DNS to your server — Caddy handles TLS automatically # DOMAIN=archon.example.com # Basic Auth (optional) — protects the Web UI and API when exposed to the internet # Leave empty to disable (e.g. when using IP-based firewall rules instead). # To enable: # 1. Generate hash: docker run caddy caddy hash-password --plaintext 'YOUR_PASSWORD' # 2. Set the variable below (replace admin and the hash): # CADDY_BASIC_AUTH=basicauth @protected { admin $$2a$$14$$REPLACE_WITH_HASH } # Form Auth (optional) — HTML login page via Caddy forward_auth + auth-service # Alternative to CADDY_BASIC_AUTH. Requires: --profile auth in docker compose. # To enable: # 1. Generate bcrypt hash (requires auth-service container): # docker compose --profile auth run --rm auth-service node -e \ # "require('bcryptjs').hash('YOUR_PASSWORD', 12).then(h => console.log(h))" # 2. Generate a random cookie secret: # docker run --rm node:22-alpine node -e \ # "console.log(require('crypto').randomBytes(32).toString('hex'))" # 3. Set the variables below and uncomment Option A in Caddyfile # AUTH_USERNAME=admin # AUTH_PASSWORD_HASH=$$2b$$12$$REPLACE_WITH_BCRYPT_HASH # ⚠ Escape every $ as $$ — Docker Compose interprets $ as variable substitution # COOKIE_SECRET=REPLACE_WITH_64_HEX_CHARS # AUTH_SERVICE_PORT=9000 # COOKIE_MAX_AGE=86400 # ============================================ # Archon Directory Configuration # ============================================ # All Archon-managed files go in ~/.archon/ by default # Override with ARCHON_HOME to use a custom location. # Docker: IGNORED. The container always uses /.archon regardless of this value # (the variable still leaks into the container env via env_file but has no effect). # ARCHON_HOME=~/.archon # Docker data directory (host path where Archon stores workspaces, worktrees, artifacts, etc.) # Default: Docker-managed volume (archon_data) # Set to an absolute path on the host for full control over data location: # Docker: host-only. Used by docker-compose to choose the bind-mount source for /.archon. # NOT read by Archon source code — the container always sees data at /.archon. # ARCHON_DATA=/opt/archon-data # Docker user-home directory (host path for /home/appuser inside the container). # /home/appuser is persisted by default so Claude Code skills/commands/agents/hooks, # Codex/Pi auth state, ~/.gitconfig, and shell history survive container rebuilds. # Default: Docker-managed volume (archon_user_home) # Set to an absolute path on the host to bind-mount instead (must be writable by UID 1001): # Docker: host-only. Used by docker-compose to choose the bind-mount source for /home/appuser. # NOT read by Archon source code. # ARCHON_USER_HOME=/opt/archon-user-home # Logging (optional) # Set log level: fatal | error | warn | info | debug | trace # Default: info # CLI can override with --quiet (error) or --verbose (debug) # LOG_LEVEL=info # Concurrency MAX_CONCURRENT_CONVERSATIONS=10 # Maximum concurrent AI conversations (default: 10) # Session Retention # SESSION_RETENTION_DAYS=30 # Delete inactive sessions older than N days (default: 30) # Anonymous Telemetry (optional) # Archon sends anonymous workflow-invocation events to PostHog so maintainers # can see which workflows get real usage. No PII — workflow name/description + # platform + Archon version + a random install UUID. No identities, no prompts, # no paths, no code. See README "Telemetry" for the full list. # # Opt out (any one disables telemetry): # ARCHON_TELEMETRY_DISABLED=1 # DO_NOT_TRACK=1 (de facto standard) # # Point at a self-hosted PostHog or a different project: # POSTHOG_API_KEY=phc_yourKeyHere # POSTHOG_HOST=https://eu.i.posthog.com (default: https://us.i.posthog.com)