# Copy to .env and fill in your values. # Settings here override the defaults in config/settings.py. # Active tier: "primary" | "fallback" ACTIVE_LLM_TIER=primary # Both tiers hit Ollama Cloud over the OpenAI-compatible endpoint. # Use a larger model on primary; the fallback fires when cumulative # latency exceeds FALLBACK_LATENCY_THRESHOLD seconds. PRIMARY_BASE_URL=http://localhost:11434/v1 PRIMARY_MODEL=gemma4:31b-cloud PRIMARY_API_KEY=ollama FALLBACK_BASE_URL=http://localhost:11434/v1 FALLBACK_MODEL=gemma4:31b-cloud FALLBACK_API_KEY=ollama # Per-turn logs are written as JSONL to /turns.jsonl LOGS_DIR=logs # off | strip | full | suppress THINKING_MODE=off THINKING_TOKEN_BUDGET=4096 FALLBACK_LATENCY_THRESHOLD=3.5 # Vision model used by /ink/recognize (needs image_url support). # Routed via Google AI Studio's OpenAI-compatible endpoint — gemma4:31b-cloud # advertises vision support but Ollama Cloud's tier gating made image inputs # unreliable, so air-writing recognition uses Gemini 2.0 Flash instead. # Get a key at: https://aistudio.google.com/apikey INK_VISION_MODEL=gemini-2.0-flash INK_VISION_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai/ INK_VISION_API_KEY= # Frontend flags (VITE_ prefix required for Vite to expose them to the browser). # Set to "false" to disable air-writing stroke capture and ink recognition. VITE_AIRWRITING_ENABLED=true # Set to "false" to disable gaze zone tracking and bucket firing. VITE_GAZE_ENABLED=true # Set to "true" only if top/bottom gaze buckets are swapped on your device. VITE_GAZE_INVERT_Y=false # Set to "false" to skip the per-user calibration window at session start. # Detectors will fall back to fixed thresholds — only use for debugging. VITE_CALIBRATION_ENABLED=true