Amadev Getting started Why Amadev? Providers Supported providers Custom providers CLI Amadev MCP Git worktrees Schedules Skills Voice Configuration Security Best practices Amadev Getting started Why Amadev? Providers Supported providers Custom providers CLI Amadev MCP Git worktrees Schedules Skills Voice Configuration Security Best practices
# Amadev loads configuration from a single JSON file in your Amadev home directory, with optional environment variable and CLI overrides.
#Where config lives
# By default, Amadev uses ~/.amadev as its home directory. The configuration file is:
~/.amadev
~/.amadev/config.json
~/.amadev/config.json
You can change the home directory by setting AMADEV_HOME or passing --home to amadev daemon start.
AMADEV_HOME
--home
amadev daemon start
#Precedence
# Amadev merges configuration in this order:
- Defaults
- config.json
- Environment variables
- CLI flags
config.json
Lists append across sources (for example, hostnames and cors.allowedOrigins).
hostnames
cors.allowedOrigins
#Example
# Minimal example that configures listening address, hostnames, and MCP:
{ "$schema": "https://amadev.org/schemas/amadev.config.v1.json", "version": 1, "daemon": { "listen": "127.0.0.1:6767", "hostnames": ["localhost", ".localhost"], "mcp": { "enabled": true } } }
{ "$schema": "https://amadev.org/schemas/amadev.config.v1.json", "version": 1, "daemon": { "listen": "127.0.0.1:6767", "hostnames": ["localhost", ".localhost"], "mcp": { "enabled": true } } }
daemon.hostnames is the primary field. The old daemon.allowedHosts name still works as a deprecated alias for backward compatibility.
daemon.hostnames
daemon.allowedHosts
#Agent providers
# Agent providers, both the first-class ones Amadev ships with and custom entries you add under agents.providers, are documented on their own page.
agents.providers
See Providers for the mental model and Supported providers for the full list of agents Amadev can launch. For pointing Claude at Anthropic-compatible endpoints (Z.AI, Alibaba/Qwen), multiple profiles, custom binaries, ACP agents, and the additionalModels merge behavior, see Custom providers. The full field reference lives on GitHub at docs/custom-providers.md.
additionalModels
#Voice
# Voice is configured through features.dictation and features.voiceMode, with provider credentials under providers.
features.dictation
features.voiceMode
providers
For voice philosophy, architecture, and complete local/OpenAI setup examples, see Voice docs.
#Logging
# Daemon logging uses separate console and file sinks by default:
- Console: info and above
- File ($AMADEV_HOME/daemon.log): trace and above
- File rotation: 10m max file size, 2 retained files total (active + 1 rotated)
info
$AMADEV_HOME/daemon.log
trace
10m
2
{ "log": { "console": { "level": "info", "format": "pretty" }, "file": { "level": "trace", "path": "daemon.log", "rotate": { "maxSize": "10m", "maxFiles": 2 } } } }
{ "log": { "console": { "level": "info", "format": "pretty" }, "file": { "level": "trace", "path": "daemon.log", "rotate": { "maxSize": "10m", "maxFiles": 2 } } } }
Legacy fields log.level and log.format are still supported and map to the new destination settings.
log.level
log.format
# You can require a password to connect to the daemon. When set, all HTTP and WebSocket clients must authenticate. Only the /api/health liveness endpoint is exempt, so that process supervisors and load balancers can probe without credentials.
/api/health
The easiest way to set a password is with the CLI:
amadev daemon set-password
amadev daemon set-password
This prompts for a password, writes the bcrypt hash to config.json, and tells you to restart the daemon.
config.json
Alternatively, set the AMADEV_PASSWORD environment variable (plaintext, hashed automatically at startup):
AMADEV_PASSWORD
AMADEV_PASSWORD=my-secret amadev daemon start
AMADEV_PASSWORD=my-secret amadev daemon start
Or write the hash directly in config.json:
config.json
{ "daemon": { "auth": { "password": "$2b$12$..." } } }
{ "daemon": { "auth": { "password": "$2b$12$..." } } }
After setting a password, restart the daemon for the change to take effect.
# The CLI picks up a password from, in order: 1. The password query parameter on a tcp:// host URI: amadev --host "tcp://192.168.1.10:6767?password=my-secret" ls
The AMADEV_PASSWORD environment variable, used as a fallback when the host carries no embedded password (works for localhost:6767, bare host:port, or tcp:// hosts without a password= query): AMADEV_PASSWORD=my-secret amadev ls AMADEV_PASSWORD=my-secret amadev --host 192.168.1.10:6767 ls
The password query parameter on a tcp:// host URI:
password
tcp://
amadev --host "tcp://192.168.1.10:6767?password=my-secret" ls
amadev --host "tcp://192.168.1.10:6767?password=my-secret" ls
The AMADEV_PASSWORD environment variable, used as a fallback when the host carries no embedded password (works for localhost:6767, bare host:port, or tcp:// hosts without a password= query):
AMADEV_PASSWORD
localhost:6767
host:port
tcp://
password=
AMADEV_PASSWORD=my-secret amadev ls AMADEV_PASSWORD=my-secret amadev --host 192.168.1.10:6767 ls
AMADEV_PASSWORD=my-secret amadev ls AMADEV_PASSWORD=my-secret amadev --host 192.168.1.10:6767 ls
A password= in the URI always wins over the env var, so you can keep AMADEV_PASSWORD set globally and still target a different daemon by spelling its password into the URI.
password=
AMADEV_PASSWORD
In the mobile app, enter the password in the direct connection setup screen.
#Common env vars
- AMADEV_HOME, set Amadev home directory
- AMADEV_PASSWORD, on the daemon, the password to require (plaintext, hashed at startup); on the CLI, the password used to connect when the host URI doesn't include one
- AMADEV_LISTEN, override daemon.listen
- AMADEV_HOSTNAMES, override/extend daemon.hostnames
- AMADEV_ALLOWED_HOSTS, deprecated alias for AMADEV_HOSTNAMES
- AMADEV_LOG_CONSOLE_LEVEL, override log.console.level
- AMADEV_LOG_FILE_LEVEL, override log.file.level
- AMADEV_LOG_FILE_PATH, override log.file.path
- AMADEV_LOG_FILE_ROTATE_SIZE, override log.file.rotate.maxSize
- AMADEV_LOG_FILE_ROTATE_COUNT, override log.file.rotate.maxFiles
- AMADEV_LOG, AMADEV_LOG_FORMAT, legacy log overrides (still supported)
- OPENAI_API_KEY, override OpenAI provider key
- AMADEV_VOICE_LLM_PROVIDER, override voice LLM provider (claude, codex, opencode)
- AMADEV_DICTATION_STT_PROVIDER, AMADEV_VOICE_STT_PROVIDER, AMADEV_VOICE_TTS_PROVIDER, override voice provider selection (local or openai)
- AMADEV_LOCAL_MODELS_DIR, control local model directory
- AMADEV_DICTATION_LOCAL_STT_MODEL, override local dictation STT model
- AMADEV_VOICE_LOCAL_STT_MODEL, AMADEV_VOICE_LOCAL_TTS_MODEL, override local voice STT/TTS models
- AMADEV_VOICE_LOCAL_TTS_SPEAKER_ID, AMADEV_VOICE_LOCAL_TTS_SPEED, optional local voice TTS tuning
AMADEV_HOME
AMADEV_PASSWORD
AMADEV_LISTEN
daemon.listen
AMADEV_HOSTNAMES
daemon.hostnames
AMADEV_ALLOWED_HOSTS
AMADEV_HOSTNAMES
AMADEV_LOG_CONSOLE_LEVEL
log.console.level
AMADEV_LOG_FILE_LEVEL
log.file.level
AMADEV_LOG_FILE_PATH
log.file.path
AMADEV_LOG_FILE_ROTATE_SIZE
log.file.rotate.maxSize
AMADEV_LOG_FILE_ROTATE_COUNT
log.file.rotate.maxFiles
AMADEV_LOG
AMADEV_LOG_FORMAT
OPENAI_API_KEY
AMADEV_VOICE_LLM_PROVIDER
claude
codex
opencode
AMADEV_DICTATION_STT_PROVIDER
AMADEV_VOICE_STT_PROVIDER
AMADEV_VOICE_TTS_PROVIDER
local
openai
AMADEV_LOCAL_MODELS_DIR
AMADEV_DICTATION_LOCAL_STT_MODEL
AMADEV_VOICE_LOCAL_STT_MODEL
AMADEV_VOICE_LOCAL_TTS_MODEL
AMADEV_VOICE_LOCAL_TTS_SPEAKER_ID
AMADEV_VOICE_LOCAL_TTS_SPEED
#Schema
# For editor autocomplete/validation, set $schema to:
$schema
https://amadev.org/schemas/amadev.config.v1.json
https://amadev.org/schemas/amadev.config.v1.json
