Configuration is one .env next to the server (written by the installer,
loaded by systemd). GRAY_* names are canonical; legacy VB_* equivalents of
the same names also work.
| Var | Purpose | Default |
|---|
GRAY_SELFHOST | Run the self-host profile (the only supported mode) | set to 1 by the installer |
GRAY_HOST | Bind address | 127.0.0.1 |
PORT | Bind port | 8848 |
GRAY_BRAIN_CWD | Working directory the brain operates in | /root (the v2 installer leaves the code default; set it explicitly to jail the brain elsewhere) |
GRAY_FILE_ROOT | File-access jail root | same as brain cwd |
GRAY_VAULT_DIR | Credentials vault directory (keep OUTSIDE the brain cwd) | /var/lib/voice-brain |
GRAY_CONVERSATIONS_DIR | Conversation store | <vault>/conversations (set by the installer) |
GRAY_RP_ID | The box’s HTTPS hostname (WebAuthn relying-party ID — reserved; the current app signs in with email codes) | localhost (the installer sets the tailnet hostname; the server warns until set) |
GRAY_RP_ORIGIN | WebAuthn origin | https://<GRAY_RP_ID> |
GRAY_USER_NAME | How Gray addresses you | the user |
PERMISSION_MODE | Brain permission model | set by installer |
| Var | Purpose | Default |
|---|
ANTHROPIC_API_KEY | Brain key (alternative to a logged-in Claude CLI) | unset — CLI login is the default |
CLAUDE_CODE_OAUTH_TOKEN | Subscription OAuth token alternative | unset |
GRAY_BRAIN_MODEL | Pin a brain model ID | unset (subscription default) |
GRAY_CONDUCTOR_MODEL | Fast voice-conductor model | sonnet |
GRAY_MODEL_PROVIDER | anthropic / bedrock / vertex / proxy | anthropic |
GRAY_AWS_REGION · GRAY_VERTEX_REGION · GRAY_VERTEX_PROJECT | Cloud-provider routing | unset |
GRAY_ANTHROPIC_BASE_URL · GRAY_ANTHROPIC_AUTH_TOKEN | Anthropic-compatible proxy | unset |
GRAY_PROVIDER_MODEL · GRAY_PROVIDER_FAST_MODEL | Provider-specific model IDs | unset |
| Var | Purpose | Default |
|---|
OPENAI_API_KEY | Premium realtime voice + transcription | unset (premium voice off without it) |
REALTIME_MODEL | Realtime voice model | gpt-realtime |
REALTIME_VOICE | Voice | ash |
REALTIME_SPEED | Server-side default speed | 1.5 |
TRANSCRIBE_MODEL | Transcription model | gpt-4o-mini-transcribe |
| Var | Purpose | Default |
|---|
RESEND_API_KEY | Send codes via Resend (wins over SMTP) | unset |
SMTP_HOST / SMTP_PORT / SMTP_USER / SMTP_PASS / SMTP_FROM | Send codes via your SMTP | unset / 587 |
AUTH_DEV_ECHO | Also write the code to <vault>/auth_dev_code.txt (dev) | unset |
TURNSTILE_SECRET | Cloudflare Turnstile on the email form | unset (off) |
With none configured, codes print to the box console log only.
| Var | Purpose | Default |
|---|
GRAY_CLAIM_CODE | Pre-bake the box code (non-interactive installs; the var keeps the log’s “claim code” name) | minted on first sign-in |
GRAY_LICENSE | Offline signed license (or <vault>/license.key) | unset |
GRAY_HUB_URL · GRAY_ORG_ID · GRAY_SELFHOST_TOKEN · GRAY_GATE_* | Org/enterprise validation — the gate activates only when all three are set | personal boxes: unset (the v2 installer writes none) |
- 8848 — internal HTTP, loopback. Published in-tailnet as HTTPS 443 by
tailscale serve.
/var/lib/voice-brain/ — the vault: auth state, entitlement, voice
meter, conversations, SSH targets and sessions, snippets. All files 0600,
directory 0700. Back it up: Data & backups.
- Logs — journald:
journalctl -u gray-server.
| Var | Purpose |
|---|
VAPID_PUBLIC / VAPID_SUBJECT | Web-push keys — browser/PWA clients only; the phone app uses native push tokens and never touches VAPID |
COMPOSIO_API_KEY | Optional MCP tool broker |