.env is the single source of truth for an Eyra runtime. Settings.load_from_env() reads every setting with defaults, validates booleans and numeric ranges, and feeds the runtime, Web UI, routing, tools, and voice stack. Most people should start with eyra setup, eyra status, and eyra settings. Edit .env directly only when you want a specific provider, model, sandbox root, or optional capability gate.

Simple settings

Use the settings command for the normal path:
eyra settings
eyra settings get MODEL
eyra settings set LIVE_SPEECH_ENABLED false
eyra settings set NETWORK_TOOLS_ENABLED true
eyra settings shows safe front-door controls and redacts secrets. It refuses direct edits to provider keys; use eyra setup for those. The menu bar uses the same settings surface, so terminal and menu controls stay in sync.

Memory and instruction files

Memory is enabled by default and stored locally:
MEMORY_ENABLED=true
MEMORY_PATH=~/.mcp-prose-memory/memory.json
MEMORY_CONTEXT_MAX_CHARS=1500
MEMORY_FACT_MAX_CHARS=220
AGENTS_FILE=~/.config/eyra/AGENTS.md
PERSONALITY_FILE=~/.config/eyra/personality.md
AGENTS.md is for short user rules. personality.md is only for style. Eyra compacts both before model calls and refuses to save raw or sensitive payloads to memory.

File precedence

Installed Eyra reads:
~/.config/eyra/.env
A source checkout can override that with the repo-local .env, but only when the current directory looks like the Eyra source tree (pyproject.toml names eyra and src/main.py exists). Eyra does not read unrelated project .env files from arbitrary current directories. Process environment variables override both files.

Provider

API_BASE_URL=http://localhost:11434/v1
API_KEY=ollama
MODEL=gemma4:e4b
VISION_MODEL=
API_BASE_URL can point at Ollama, LM Studio, vLLM, OpenRouter, Groq, OpenAI, or any compatible /v1/chat/completions endpoint. Local providers ignore API_KEY. Cloud providers require a real key and receive prompts, tool results, and model-bound content because you configured that provider.

Models

Default behavior: all requests use MODEL after local policy routing.
COMPLEXITY_ROUTING_ENABLED=false
SIMPLE_MODEL=qwen3.5:2b
MODERATE_MODEL=gemma4:e4b
WORKER_MODEL=
If complexity routing is off, Eyra validates MODEL, WORKER_MODEL when set, and VISION_MODEL when set. If routing is on, Eyra validates all tier models.

Voice

LIVE_LISTENING_ENABLED=true
LIVE_SPEECH_ENABLED=true
SPEECH_COOLDOWN_MS=3000
VOICE_INPUT_DEVICE=
VOICE_SAMPLE_RATE=16000
VOICE_SILENCE_MS=1500
VOICE_VAD_THRESHOLD=0.15
VOICE_INPUT_DEVICE accepts a sounddevice input index or name. Leave it empty for the system default.

Filesystem sandbox

FILESYSTEM_ALLOWED_PATHS=~/Documents,~/Desktop,~/Downloads,/tmp
FILESYSTEM_DEFAULT_PATH=~/Documents
Relative paths resolve under FILESYSTEM_DEFAULT_PATH, then Eyra checks that the resolved path sits under one of FILESYSTEM_ALLOWED_PATHS.

Optional capability gates

Default behavior: optional tools are disabled.
NETWORK_TOOLS_ENABLED=false
OS_TOOLS_ENABLED=false
AGENT_TOOLS_ENABLED=false
EXTERNAL_AGENT_TOOLS_ENABLED=false
MCP_TOOLS_ENABLED=false
CONNECTORS_ENABLED=false
Enable only the surface you need. Eyra still applies route policy, sandboxing, approval checks, and privacy reporting after a capability is enabled.

Connectors

CONNECTORS_CONFIG_PATH=~/.config/eyra/connectors.json
CONNECTORS_ALLOWED_ROOTS=
CONNECTORS_TIMEOUT_SECONDS=600
CONNECTORS_OUTPUT_CAP_BYTES=32768
CONNECTORS_ALLOW_REMOTE=false
CONNECTORS_ALLOW_PYTHON_MODULE=false
Connectors are declared workers such as CLIs, MCP runners, local HTTP services, remote HTTP services, browser agents, coding agents, or guarded Python modules. Keep CONNECTORS_ALLOWED_ROOTS empty to reuse FILESYSTEM_ALLOWED_PATHS. Remote and Python-module connectors stay refused until their explicit opt-ins are enabled.

Web UI

WEB_UI_ENABLED=false
WEB_UI_HOST=127.0.0.1
WEB_UI_PORT=8765
WEB_UI_TOKEN=
WEB_UI_REQUIRE_TOKEN=auto
WEB_UI_MAX_REQUEST_BYTES=1000000
WEB_UI_REQUIRE_TOKEN=auto requires a token for every non-health endpoint. WEB_UI_REQUIRE_TOKEN=false is allowed only on localhost; non-localhost binds always require a token.

Realtime voice

REALTIME_VOICE_ENABLED=false
REALTIME_MODEL=gpt-realtime
REALTIME_VOICE=marin
OPENAI_API_KEY=
REALTIME_TOOLS_ENABLED=false
REALTIME_ALLOWED_TOOLS=
Realtime voice is online. Eyra mints ephemeral browser client secrets server-side and never puts the standard OpenAI API key in browser code.

Logs and stores

JOB_STORE_PATH=~/.local/share/eyra/jobs.sqlite3
TRIGGER_STORE_PATH=~/.local/share/eyra/triggers.sqlite3
# EYRA_LOG_FILE=~/Library/Logs/Eyra/eyra.log
Jobs, task logs, artifacts, operation ledger entries, and triggers are local SQLite state. The macOS log file defaults to ~/Library/Logs/Eyra/eyra.log.