Configuration
- File location:
~/.aethon/config.yaml(override with--config / -con any command). - Format: YAML, validated with Pydantic. A missing or empty file produces a fully-defaulted config — every section falls back to its defaults.
- Writing: the wizard and tooling write YAML with
sort_keys=Falseandallow_unicode=True, creating parent directories as needed.
This page is the conceptual guide. For an exhaustive field-by-field table of every config section, see the Configuration Reference.
Let the wizard do it
Most people never hand-edit the file. Run:
aethon init # writes ~/.aethon/config.yaml
aethon doctor # verifies provider/model + memory
aethon init walks a provider menu (openai / anthropic / ollama), configures
messaging bots, and (for Ollama embeddings) offers to install Ollama and pull the
embedding model. Use --config / -c to choose a path and --force to overwrite an
existing config without asking.
${ENV_VAR} resolution
A string value is treated as an environment-variable reference only if it starts
with ${ and ends with } (whole-string only — no partial or interpolated
substitution). The inner name is looked up via os.environ. A missing env var
resolves to an empty string "", not an error. Resolution recurses into dicts and
lists; ints, bools, floats, and None pass through unchanged.
channels:
telegram:
enabled: true
token: ${TELEGRAM_BOT_TOKEN} # actual secret supplied via the environment
Keep secrets in files like ~/.aethon/credentials/telegram.env and export them into
the environment, rather than committing them into the config.
A minimal config
The smallest useful config just selects a provider and a key:
model:
provider: openai
model_id: gpt-4o
api_key: ${OPENAI_API_KEY}
Everything else (channels, memory, multi-agent, SOPs, scheduler, dashboard, webhook, telemetry…) falls back to sensible defaults. Turn things on as you need them — see the Configuration Reference for the full set of sections and defaults.
Capabilities & runtime features (opt-in)
The newer capability blocks are off by default unless noted. Powerful or host-affecting features stay disabled until you opt in, and the security & approval hooks gate the rest. (Browse live status in the dashboard's Features panel.)
# Vendored utility tools (scraper/github/jsonrpc/notify default ON; computer OFF).
capabilities:
scraper: { enabled: true }
github: { enabled: true } # use_github (reads $GITHUB_TOKEN)
jsonrpc: { enabled: true }
notify: { enabled: true, method: auto }
computer: { enabled: false, require_approval: true } # ⚠ screen/mouse/keyboard; needs [computer] + macOS perms
# macOS native tools (Darwin-only). Messages & Keychain are explicit opt-in.
macos:
enabled: true
enable_calendar: true
enable_reminders: true
enable_mail: true
enable_notes: true
enable_shortcuts: true
enable_messages: false # ⚠ can send iMessage/SMS as you
enable_keychain: false # ⚠ can read/write the Keychain
actions_requiring_approval: ["mail.send", "messages.send", "keychain.set"]
lsp: # needs [lsp] (pyright) / language servers on PATH
enabled: false
auto_diagnostics: false # append diagnostics after file-modifying tools
runtime_tools: # manage_tools (sandboxed dynamic tool loading)
enabled: false
allow_create: false # create/fetch (subprocess sandbox validates first)
allow_install: false # add/reload (auto-install missing packages)
session_recorder: # timeline + snapshots → ZIP, replay in the dashboard
enabled: false
max_events: 10000
ambient: # proactive / autonomous idle-time work
enabled: false
auto_start: false
prompt: # system-prompt awareness layers
include_environment: true
include_learnings: true
include_recent_logs: true
include_shell_history: false # privacy
include_self_awareness: false # embeds key source files — heavy
performance:
max_tool_output_chars: 12000 # cap a single tool result so it can't overflow the context (0 = off)
paths:
recordings: "~/.aethon/recordings"
See Capabilities for what each of these unlocks.
Security & exposure
A few defaults fail closed — worth knowing before you expose a surface:
- Network bots deny every sender by default. Telegram, Discord, Slack, and
WhatsApp reject all senders (including you) unless their id is listed under
security.allowed_senders.<channel>; an enabled bot with an empty allowlist also triggers a loud startup warning. See Messaging Bots. - A non-loopback WebChat bind requires a dashboard token. If
channels.webchat.hostis anything other than loopback,dashboard.auth_tokenmust be set — the server refuses to start otherwise (or passaethon start --insecure-bindbehind your own authenticating reverse proxy). - Webhooks fail closed beyond loopback. With
webhook.secretempty on a non-loopback bind the/webhook/*routes are not registered; set the secret to enable HMAC-SHA256 verified webhooks. - Optional shell sandbox. Set
security.sandbox: dockerto run theshelltool in a per-session container (AETHON refuses to start if Docker is unavailable rather than silently falling back to host execution).
security:
allowed_senders:
telegram: ["123456789"] # per-channel allowlist; empty = deny all on network bots
sandbox: none # set to "docker" to sandbox the shell tool
dashboard:
auth_token: ${AETHON_DASHBOARD_TOKEN} # required for any non-loopback bind
webhook:
secret: ${AETHON_WEBHOOK_SECRET} # required for webhooks beyond loopback
See Security for the full exposure model.