Skip to content

Configuration

Environment variables and config files that drive the stack. ./jarvis up copies .env.example to .env (gitignored) on first run — the values below are all dev-only defaults, never real secrets.

Required keys

tools/checks/env_contract.py enforces which keys .env.example must define for a zero-credential first run: COMPOSE_PROJECT_NAME, POCKETBASE_HOST_PORT, POCKETBASE_URL, SUPERUSER_EMAIL, SUPERUSER_PASSWORD, DEV_USER_EMAIL, DEV_USER_PASSWORD, LLM_PROVIDER. It also enforces that JARVIS_IMAP_MAIN_USER and JARVIS_IMAP_MAIN_PASSWORD stay documented (as commented-out lines) even though they're optional.

.env.example

Every variable .env.example defines, in file order.

Var Default Purpose
COMPOSE_PROJECT_NAME jarvis Compose project name — keeps this stack's containers/volumes separate from other stacks on the same host.
POCKETBASE_HOST_PORT 8091 Host port PocketBase is published on (127.0.0.1 only).
POCKETBASE_URL http://pocketbase:8090 PocketBase URL as seen inside the compose network (service name) — used by the bootstrap/agent/cli containers.
SUPERUSER_EMAIL dev@jarvis.local PocketBase superuser email, upserted on first run (dev-only).
SUPERUSER_PASSWORD devpassword123 PocketBase superuser password (dev-only).
DEV_USER_EMAIL user@jarvis.local The seeded app-user account's email.
DEV_USER_PASSWORD userpassword123 The seeded app-user account's password.
LLM_PROVIDER stub LLM backend: stub runs fully offline with canned responses; set to deepseek (and supply DEEPSEEK_API_KEY) for the real provider.
DEEPSEEK_API_KEY (commented out) DeepSeek API key — required when LLM_PROVIDER=deepseek.
JARVIS_IMAP_MAIN_USER (commented out) Owner-supplied IMAP username for the live email capture connector. Optional — capture is disabled unless a cap_connectors row enables it.
JARVIS_IMAP_MAIN_PASSWORD (commented out) Owner-supplied IMAP app password, paired with JARVIS_IMAP_MAIN_USER. Never commit a real value.
JARVIS_VECTOR_DB (commented out) Conversation module: sidecar vector-store path (falls back to <JARVIS_PB_DATA or pb_data>/vectors.db).
JARVIS_EMBED_MODEL (commented out) Conversation module: embedding model id (falls back to a multilingual MiniLM model).
JARVIS_INDEX_EXCLUDE (commented out) Conversation module: extra :-separated exclude globs when indexing the vault.

Runtime / host-supplied

Vars the running system reads but that aren't in .env.example — supplied by Compose service environment: blocks, a LaunchAgent's EnvironmentVariables, or set by hand for a one-off run.

Var Default Purpose
DEEPSEEK_BASE_URL https://api.deepseek.com DeepSeek API base URL, overridable for testing.
LLM_MODEL deepseek-chat DeepSeek model id.
AGENT_DRY_RUN unset (falsy) Any value other than empty/0 puts the agent runtime in dry-run mode.
JARVIS_OWNER_EMAIL "" Comma-separated owner addresses, used to distinguish the owner's own messages/handles across connectors.
JARVIS_VAULT_DIR unset (required where used) Obsidian vault root — shared by the capture pipeline and the conversation module's indexer/resolver.
JARVIS_DISCORD_TOKEN unset Discord bot token for the live Discord capture connector (declared as a capture module secret).
JARVIS_GRAFANA_URL unset (required) Base URL of the Grafana instance the homelab agent reads from.
JARVIS_GRAFANA_TOKEN unset (required) Bearer token for the Grafana/Prometheus API.
JARVIS_GRAFANA_DS_UID "" Datasource UID used to fetch per-alert PromQL evidence; without it, alerts are reported without evidence.
JARVIS_PB_DATA /vault (scheduler) / pb_data (fallback) Base dir the conversation module derives its default vector-store path from.
JARVIS_EMBED_FAKE unset Set to 1 to use a fake (non-downloading) embedding provider — used in tests/CI.
JARVIS_CHAT_POLL_SECS 2.0 Chat-tab worker's poll interval between checking for pending turns.
JARVIS_CHAT_CONTEXT_CHARS 4000 Chat-tab worker's character cap on context assembled per turn.
CAPTURE_POLL_LIMIT 200 Max items the capture poll fetches per connector per run.

Flutter dart-defines

Resolved by core/lib/config/core_config.dart via --dart-define, with safe fallback defaults baked in.

Dart-define Default Purpose
JARVIS_BACKEND_URL "" (empty) Pre-fills the first-run backend-URL field; empty means "ask the owner".
JARVIS_USERS_COLLECTION users Backend collection name the app resolves the logical users collection to.
JARVIS_DEMO_ITEMS_COLLECTION demo_items Backend collection name the app resolves the logical demo_items collection to.
JARVIS_LLM_PROVIDER deepseek LLM provider label the app displays/assumes for its own UI.