Skip to main content
Vexa is configured by environment variables, set in deploy/compose/.env for Docker Compose (seeded from .env.example on first make all). Defaults below are what the stack falls back to when the variable is unset — fine for local evaluation, not for anything exposed.
Change every secret (ADMIN_TOKEN, INTERNAL_API_SECRET, DB and MinIO credentials, VEXA_DISPATCH_SIGNING_KEY, NEXTAUTH_SECRET) before putting the stack on a network. The defaults are public.

Transcription (STT)

VariableDefaultPurpose
TRANSCRIPTION_SERVICE_URLSTT service base URL (the client appends /v1/audio/transcriptions), e.g. http://<gpu-host>:8083. Point it at the bundled service you deploy separately (deploy/transcription) or a hosted endpoint. Unset → bots join and record but produce no transcript.
TRANSCRIPTION_SERVICE_TOKENSTT auth token — must match the API_TOKEN of your deploy/transcription unit, or a token from vexa.ai/account.
The STT service is the GPU workload, deployed separately from this stack — see Deployment → Transcription. The main stack stays GPU-free and reaches it over the network via the two variables above.

Secrets & identity

VariableDefaultPurpose
ADMIN_TOKENchangemeAdmin API key (X-Admin-API-Key) — mints users and tokens.
INTERNAL_API_SECRETvexa-internal-secretShared secret for service-to-service calls.
VEXA_DISPATCH_SIGNING_KEYdev-dispatch-signing-keySigns dispatch tokens (the identity chain of custody).
NEXTAUTH_SECRETdev-nextauth-secretSession secret for the web UI.
VEXA_BOT_API_KEYPre-shared key a bot uses to call back into the stack.

Database & storage

VariableDefaultPurpose
DB_NAME / DB_USER / DB_PASSWORDvexa / postgres / postgresPostgres credentials (metadata).
POSTGRES_HOST_PORT5458Host port mapped to Postgres.
MINIO_ENDPOINTminio:9000Object storage endpoint (recordings + workspaces).
MINIO_ACCESS_KEY / MINIO_SECRET_KEYvexa-access-key / vexa-secret-keyMinIO credentials.
MINIO_ROOT_USER / MINIO_ROOT_PASSWORDvexa-access-key / vexa-secret-keyMinIO root credentials.
MINIO_BUCKETvexaBucket holding recordings and agent workspaces.
MINIO_SECUREfalseUse TLS to reach MinIO.

Agent inference (bring your own)

Point the agent at your own model so no inference leaves the network.
VariableDefaultPurpose
VEXA_AGENT_MODELModel the agent runner uses.
VEXA_MEETING_MODELModel for meeting-time processing.
ANTHROPIC_API_KEYKey for Anthropic-backed runners.
ANTHROPIC_MODEL · ANTHROPIC_DEFAULT_OPUS_MODEL · …_SONNET_MODEL · …_HAIKU_MODELPer-tier model overrides.
HOST_CLAUDE_CREDENTIALSHost path to Claude credentials mounted into agent containers (see below).
VEXA_AGENT_DEFAULT_SUBJECTu_liveFallback subject before the gateway fronts agent-api.

Claude subscription credentials (HOST_CLAUDE_CREDENTIALS)

Setting HOST_CLAUDE_CREDENTIALS=~/.claude/.credentials.json mounts your Claude Code sign-in into the agent containers (read-only), so the agent runs on your subscription instead of an API key. Whether that file stays valid depends on the host OS:
  • Linux (and Windows via WSL2 — run the stack and the claude CLI inside WSL): the file is Claude Code’s own store; the CLI refreshes it in place. Nothing to do.
  • macOS: the CLI’s source of truth is the login Keychain — the file is a one-time export whose token expires every ~8–12 hours. Symptom: agent chat fails with 401 Invalid authentication credentials while claude works fine in your terminal. Install the bundled sync daemon once:
    deploy/bin/claude-creds-sync/install.sh
    
    It registers a launchd user agent (ai.vexa.claude-creds-sync) that re-exports the Keychain into the file every 5 minutes, write-only-on-change, preserving the inode the containers mount. install.sh uninstall removes it. Details: deploy/bin/claude-creds-sync/README.md.
The credential-file mount is a single-developer convenience. For a portable setup that survives token rotation on any OS, configure an API key or a custom endpoint in Settings → Models (stored per-user/global in the database) — see the setup wizard or the table above.

Auto-join & calendar sync

Timing knobs for the two meeting-api background sweeps (auto-join and calendar sync). Both degrade gracefully: without ADMIN_API_URL + INTERNAL_API_SECRET, calendar sync no-ops and auto-join spawns without per-user context — the stack still boots.
VariableDefaultPurpose
AUTO_JOIN_SWEEP_INTERVAL_S30How often scheduled meetings are checked for a due start.
AUTO_JOIN_LEAD_S60The bot is sent this many seconds before the scheduled time.
AUTO_JOIN_GRACE_S600A meeting whose start passed longer ago than this is skipped — never joined hours late.
AUTO_JOIN_RETRY_BACKOFF_S300Wait after a loud auto-join failure (cap/quota/spawn) before retrying that meeting.
CALENDAR_SYNC_INTERVAL_S300How often connected ICS feeds are re-fetched and upserted.
ADMIN_API_URLadmin-api base URL for the sweeps’ internal lookups (spawn context, calendar configs).

Images & runtime

VariableDefaultPurpose
IMAGE_TAGdevTag for the built service images.
BROWSER_IMAGEvexaai/vexa-bot:v012Browser/bot container the runtime spawns per meeting. Built from source (make bot), spawned without pulling — the published vexaai/vexa-bot:dev is the old 0.10 line and is incompatible.
AGENT_IMAGE / AGENT_WORKER_IMAGEvexaai/v012-agent-*Agent container the runtime spawns per dispatch.
DOCKER_GID0Host docker group id, so the runtime can use the Docker socket.
LOG_LEVELinfoLog verbosity.

Ports

Host ports the compose stack publishes on 127.0.0.1 (override any of them in .env):
VariableDefaultService
API_GATEWAY_HOST_PORT18056gateway (the one front door)
ADMIN_API_PORT18057admin-api
MEETING_API_PORT18080meeting-api
RUNTIME_API_PORT18090runtime
AGENT_API_PORT18100agent-api
TERMINAL_PORT13000web UI / terminal
MINIO_HOST_PORT / MINIO_CONSOLE_HOST_PORT9000 / 9001MinIO API / console
The gateway (:18056) is the one front door; the terminal web workbench is at :13000. The other host ports above are bound to 127.0.0.1 for local inspection and aren’t needed for day-to-day use.