# AutoScholar.ai — environment reference. No real values here. Copy to .env (never committed). # --- Control plane (apps/web + services/scheduler) --- NODE_ENV=development # development | production | test APP_BASE_URL=http://localhost:8470 # canonical public base URL (https://autoscholar.ai in production) PORT=8470 # web port DATABASE_URL=postgresql://localhost:5432/autoscholar # PostgreSQL 17 connection string ARTIFACT_ROOT=./data/artifacts # filesystem artifact store root (private); public promotions live under /public SESSION_SECRET= # >=32 random bytes, hex; signs session cookies and CSRF tokens ADMIN_BOOTSTRAP_USERNAME=admin # used only when admin_users is empty ADMIN_BOOTSTRAP_PASSWORD= # used only when admin_users is empty; forced rotation at first login; never logged WORKER_ENROLLMENT_SECRET= # one-time secret a new MacLustr worker presents to enroll; rotate after use INTERNAL_API_ALLOWED_CIDRS=127.0.0.1/32,192.168.2.0/24 # networks allowed to reach /api/internal/* TRUST_PROXY=0 # 1 behind the MacLustr Tunnel (Caddy sets X-Forwarded-For) LOG_LEVEL=info SCHEDULER_TICK_MS=5000 LEASE_TTL_SECONDS=120 DEFAULT_MAX_BUDGET_USD=25 DEFAULT_MAX_RUNTIME_MINUTES=240 PUBLISHING_ENABLED=1 # emergency switch: 0 halts all automatic publication DISPATCH_ENABLED=1 # emergency switch: 0 pauses all new dispatches STAGING_MODE=0 # 1 = staging/demo content allowed, site marked noindex # --- Worker (services/worker, runs as the dedicated low-privilege user on a MacLustr node) --- CONTROL_PLANE_URL=http://192.168.2.85:8470 # LAN address of the control plane (never the public domain) WORKER_NAME= # e.g. M4M64c WORKER_TOKEN= # issued at enrollment (or WORKER_ENROLLMENT_SECRET for first enrollment) WORKER_ROOT=/var/autoscholar # run workspaces live in /runs/ WORKER_MAX_CONCURRENT=1 ANTHROPIC_API_KEY= # server-side only; research runner subprocess env; never sent to the browser ANTHROPIC_MODEL=claude-opus-5-5 # default research model (overridable per run) RESEARCH_ALLOWED_DOMAINS= # extra egress hostnames allowed inside the sandbox (comma separated) TECTONIC_BIN=/opt/homebrew/bin/tectonic WORKER_MODE=real # real | simulated (simulated is for tests only; results are flagged synthetic)