# ═══════════════════════════════════════════════════════════ # LeadEcho — environment configuration # Copy this to .env and fill in the values # Run: cp .env.example .env # ═══════════════════════════════════════════════════════════ # ── Database ────────────────────────────────────────────── DATABASE_URL=postgres://leadecho:leadecho@localhost:5433/leadecho_dev?sslmode=disable REDIS_URL=redis://localhost:6380/0 # ── API server ──────────────────────────────────────────── PORT=8090 ENVIRONMENT=development LOG_LEVEL=debug # ── Security ────────────────────────────────────────────── # Generate a good secret: openssl rand -hex 32 JWT_SECRET=change-this-to-a-random-secret-in-production ENCRYPTION_KEY= # optional — defaults to JWT_SECRET # ── Frontend URL (for OAuth redirects) ──────────────────── FRONTEND_URL=http://localhost:3100 # ── AI providers — at least one required for scoring ────── # Priority order at startup: NVIDIA → GLM → OpenAI # Free option: NVIDIA NIM (Nemotron, OpenAI-compatible) # Get from https://build.nvidia.com — generous free tier NVIDIA_API_KEY= NVIDIA_MODEL=nvidia/llama-3.3-nemotron-super-49b-v1 # Cheaper option: GLM (ZhipuAI glm-4.5-flash) GLM_API_KEY= # Or: DeepSeek (OpenAI-compatible, very cost-effective) DEEPSEEK_API_KEY= # Or: OpenAI OPENAI_API_KEY= # Anthropic support via compatible endpoint — set OPENAI_API_KEY # pointing to Anthropic's OpenAI-compatible base URL # Or: Ollama Cloud (OpenAI-compatible, https://ollama.com/v1) # Get from https://ollama.com/settings/keys OLLAMA_API_KEY= OLLAMA_MODEL=gpt-oss:120b # ── Embeddings — semantic pain-point matching ───────────── # Get from https://voyage.ai (free tier available) # Without this key, falls back to keyword-only matching VOYAGE_API_KEY= # ── Web-wide discovery (Exa) ────────────────────────────── # Get from https://dashboard.exa.ai/api-keys (free tier ~1k searches/mo) # Enables the "exa" monitor source: semantic search across the entire web # (blogs, forums, news) beyond the fixed platform crawlers. # Without this key, the exa source is simply skipped. EXA_API_KEY= # ── Email (Resend) ───────────────────────────────────────── # https://resend.com — 3,000 emails/mo free tier # Used for: welcome emails on registration, notification digests RESEND_API_KEY= # ── Google OAuth (optional) ─────────────────────────────── # Email/password auth works without this # Get from: https://console.cloud.google.com/apis/credentials GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= GOOGLE_REDIRECT_URL=http://localhost:8090/api/v1/auth/google/callback # ── Pinchtab browser sidecar ────────────────────────────── # Required for authenticated Reddit + Twitter crawling # Start: docker compose --profile browser up -d PINCHTAB_URL=http://localhost:9867 PINCHTAB_TOKEN=changeme # ── Camoufox stealth browser (Pro LinkedIn) ─────────────── # Optional — improves LinkedIn crawl stealth vs Pinchtab # Start: docker compose --profile browser-pro up -d CAMOUFOX_URL= CAMOUFOX_TOKEN=changeme # ── Scrapling stealth fallback ────────────────────────────── # Fallback when Pinchtab/Camoufox unavailable (anti-bot bypass) # Start: docker compose --profile browser-scrapling up -d SCRAPLING_URL= SCRAPLING_TOKEN=changeme # ── Redis Streams (Phase 1 dual-write) ──────────────────── STREAMS_ENABLED=false STREAMS_DUAL_WRITE_ENABLED=false STREAMS_INLINE_FALLBACK_ENABLED=true STREAMS_WORKERS_IN_API=true # Keep all consumer flags false for Phase 1 observe-only rollout STREAMS_SCORER_CONSUMER_ENABLED=false STREAMS_NOTIFIER_CONSUMER_ENABLED=false STREAMS_QUALIFIER_CONSUMER_ENABLED=false STREAMS_REPLY_DRAFTER_CONSUMER_ENABLED=false STREAMS_WORKFLOW_CONSUMER_ENABLED=false STREAMS_RETRY_CONSUMER_ENABLED=false METRICS_ENABLED=false