{"repo": "aidenestelle/crawler", "files": {".env.production.example": {"d747fa97982b8fb4f8f62dca4a595d1258984b8a": {"t": 1785745151.5325272, "n": 659, "h": "af167525ca46da2b", "c": "# Estellebot — production env template for VPS deploy.\n# Copy to `.env` on the VPS, fill values, then `docker compose -f compose.prod.yml up -d`.\n# NEVER commit a populated copy of this file.\n\n# --- Required ---\nSUPABASE_URL=https://YOUR-PROJECT.supabase.co\nSUPABASE_SERVICE_KEY= # service-role key (NOT anon)\n\n# --- Optional AI verify (pick at most one; precedence: GEMINI > DEEPSEEK > OLLAMA) ---\nGEMINI_API_KEY=\nDEEPSEEK_API_KEY=\nOLLAMA_HOST=\n\n# --- Tuning (defaults shown — usually leave alone) ---\n# WORKER_CONCURRENCY=3\n# REAPER_INTERVAL_MS=30000\n# REAPER_TIMEOUT_MS=180000\n# GRACEFUL_SHUTDOWN_MS=120000\n# LOG_LEVEL=info\n# HIPAA_DEEP_SCAN_ENABLED=true\n"}, "7bf6d883a954ab61279369092f9db9c3f6d7daf3": {"t": 1785748220.1702318, "n": 659, "h": "af167525ca46da2b", "c": "# Estellebot — production env template for VPS deploy.\n# Copy to `.env` on the VPS, fill values, then `docker compose -f compose.prod.yml up -d`.\n# NEVER commit a populated copy of this file.\n\n# --- Required ---\nSUPABASE_URL=https://YOUR-PROJECT.supabase.co\nSUPABASE_SERVICE_KEY= # service-role key (NOT anon)\n\n# --- Optional AI verify (pick at most one; precedence: GEMINI > DEEPSEEK > OLLAMA) ---\nGEMINI_API_KEY=\nDEEPSEEK_API_KEY=\nOLLAMA_HOST=\n\n# --- Tuning (defaults shown — usually leave alone) ---\n# WORKER_CONCURRENCY=3\n# REAPER_INTERVAL_MS=30000\n# REAPER_TIMEOUT_MS=180000\n# GRACEFUL_SHUTDOWN_MS=120000\n# LOG_LEVEL=info\n# HIPAA_DEEP_SCAN_ENABLED=true\n"}}, ".env.example": {"d747fa97982b8fb4f8f62dca4a595d1258984b8a": {"t": 1785745176.2477834, "n": 1544, "h": "2205afe89dd6d3a0", "c": "# Estellebot — environment configuration\n#\n# Copy to .env and fill in the required values.\n\n# --- Required ----------------------------------------------------------------\n# Supabase project that owns the `hipaa_deep_scans` table.\nSUPABASE_URL=your_supabase_project_url\n# Service role key (bypasses RLS — worker uses it to update row status).\nSUPABASE_SERVICE_KEY=your_supabase_service_role_key\n\n# --- Optional: worker tuning -------------------------------------------------\n# Max concurrent scans per process (Playwright contexts). Default: 3\nWORKER_CONCURRENCY=3\n# How often (ms) to run reaper + tick. Default: 30000\nREAPER_INTERVAL_MS=30000\n# How long (ms) a running row may sit before the reaper releases it. Default: 180000 (3 min)\nREAPER_TIMEOUT_MS=180000\n# Optional prefix prepended to the worker id for log readability (e.g. \"staging\").\nWORKER_ID_PREFIX=\n\n# --- Optional: feature flags -------------------------------------------------\n# Kill-switch for the HIPAA handler. Set to \"false\" to boot an idle worker.\nHIPAA_DEEP_SCAN_ENABLED=true\n# Log level: debug | info | warn | error. Default: info\nLOG_LEVEL=info\n\n# --- Optional: AI verification (Epic 3) --------------------------------------\n# Provider precedence: GEMINI_API_KEY > DEEPSEEK_API_KEY > OLLAMA_HOST > disabled.\n# Leave all blank to disable the AI pass (deterministic scan still runs).\nGEMINI_API_KEY=\nDEEPSEEK_API_KEY=\nOLLAMA_HOST=\nOLLAMA_MODEL=gemma3:4b\n# Hard timeout (ms) for the AI classify() call. Default: 15000. Ollama floors at 30000.\nAI_VERIFY_TIMEOUT_MS=15000\n"}, "7bf6d883a954ab61279369092f9db9c3f6d7daf3": {"t": 1785748219.8747468, "n": 1544, "h": "2205afe89dd6d3a0", "c": "# Estellebot — environment configuration\n#\n# Copy to .env and fill in the required values.\n\n# --- Required ----------------------------------------------------------------\n# Supabase project that owns the `hipaa_deep_scans` table.\nSUPABASE_URL=your_supabase_project_url\n# Service role key (bypasses RLS — worker uses it to update row status).\nSUPABASE_SERVICE_KEY=your_supabase_service_role_key\n\n# --- Optional: worker tuning -------------------------------------------------\n# Max concurrent scans per process (Playwright contexts). Default: 3\nWORKER_CONCURRENCY=3\n# How often (ms) to run reaper + tick. Default: 30000\nREAPER_INTERVAL_MS=30000\n# How long (ms) a running row may sit before the reaper releases it. Default: 180000 (3 min)\nREAPER_TIMEOUT_MS=180000\n# Optional prefix prepended to the worker id for log readability (e.g. \"staging\").\nWORKER_ID_PREFIX=\n\n# --- Optional: feature flags -------------------------------------------------\n# Kill-switch for the HIPAA handler. Set to \"false\" to boot an idle worker.\nHIPAA_DEEP_SCAN_ENABLED=true\n# Log level: debug | info | warn | error. Default: info\nLOG_LEVEL=info\n\n# --- Optional: AI verification (Epic 3) --------------------------------------\n# Provider precedence: GEMINI_API_KEY > DEEPSEEK_API_KEY > OLLAMA_HOST > disabled.\n# Leave all blank to disable the AI pass (deterministic scan still runs).\nGEMINI_API_KEY=\nDEEPSEEK_API_KEY=\nOLLAMA_HOST=\nOLLAMA_MODEL=gemma3:4b\n# Hard timeout (ms) for the AI classify() call. Default: 15000. Ollama floors at 30000.\nAI_VERIFY_TIMEOUT_MS=15000\n"}, "65a5753babedfd205fb900d0373355e5b83e0436": {"t": 1785748220.9485066, "n": 334, "h": "7a4ff814bd927758", "c": "# Supabase Configuration (Required)\nSUPABASE_URL=your_supabase_project_url\nSUPABASE_SERVICE_KEY=your_supabase_service_role_key\n\n# Crawler Configuration (Optional)\nCRAWLER_CONCURRENCY=5\nCRAWLER_DEFAULT_TIMEOUT=30000\nCRAWLER_USER_AGENT=SemDashBot/1.0 (+https://semdash.com/bot)\nCRAWLER_RESPECT_ROBOTS_TXT=true\n\n# Logging\nLOG_LEVEL=info\n"}}, "fly.toml": {"d747fa97982b8fb4f8f62dca4a595d1258984b8a": {"t": 1785745348.7343407, "n": 916, "h": "18c75731849c064f", "c": "# Estellebot staging — Fly.io manifest.\n# NOTE: Fly.io is provisional (pending CEO decision ceo-014). This file is\n# intentionally small so switching to Railway or a VPS is a small edit.\n# No HTTP [[services]] block — estellebot is a worker, not a web app.\n# The /healthz endpoint exists for liveness/readiness but is not publicly routed.\n\napp = \"estellebot-staging\"\nprimary_region = \"iad\"\n\n[build]\n dockerfile = \"Dockerfile\"\n\n[env]\n NODE_ENV = \"production\"\n WORKER_CONCURRENCY = \"3\"\n AI_VERIFY_TIMEOUT_MS = \"15000\"\n PORT = \"8080\"\n\n[processes]\n worker = \"node dist/index.js\"\n\n[[vm]]\n memory = \"1gb\"\n cpu_kind = \"shared\"\n cpus = 1\n\n[deploy]\n strategy = \"rolling\"\n max_unavailable = 1\n\n# Secrets (NOT stored in this file — set via `fly secrets set`):\n# SUPABASE_URL\n# SUPABASE_SERVICE_KEY\n# GEMINI_API_KEY (optional)\n# DEEPSEEK_API_KEY (optional)\n# OLLAMA_HOST (optional)\n"}, "7bf6d883a954ab61279369092f9db9c3f6d7daf3": {"t": 1785748220.268467, "n": 916, "h": "18c75731849c064f", "c": "# Estellebot staging — Fly.io manifest.\n# NOTE: Fly.io is provisional (pending CEO decision ceo-014). This file is\n# intentionally small so switching to Railway or a VPS is a small edit.\n# No HTTP [[services]] block — estellebot is a worker, not a web app.\n# The /healthz endpoint exists for liveness/readiness but is not publicly routed.\n\napp = \"estellebot-staging\"\nprimary_region = \"iad\"\n\n[build]\n dockerfile = \"Dockerfile\"\n\n[env]\n NODE_ENV = \"production\"\n WORKER_CONCURRENCY = \"3\"\n AI_VERIFY_TIMEOUT_MS = \"15000\"\n PORT = \"8080\"\n\n[processes]\n worker = \"node dist/index.js\"\n\n[[vm]]\n memory = \"1gb\"\n cpu_kind = \"shared\"\n cpus = 1\n\n[deploy]\n strategy = \"rolling\"\n max_unavailable = 1\n\n# Secrets (NOT stored in this file — set via `fly secrets set`):\n# SUPABASE_URL\n# SUPABASE_SERVICE_KEY\n# GEMINI_API_KEY (optional)\n# DEEPSEEK_API_KEY (optional)\n# OLLAMA_HOST (optional)\n"}}}}