# Database (local Docker Postgres by default) # # Supabase (recommended on Vercel): # - DATABASE_URL: Supabase "Connection pooler" connection string (include `pgbouncer=true&connection_limit=1`) # - DIRECT_URL: Supabase "Direct connection" connection string (used for Prisma migrations) DATABASE_URL="postgresql://minebench:minebench@localhost:54327/minebench?schema=public" DIRECT_URL="postgresql://minebench:minebench@localhost:54327/minebench?schema=public" # Admin ADMIN_TOKEN= # Optional dedicated HMAC secret for arena matchup/vote tokens. # If unset, ADMIN_TOKEN or NEXTAUTH_SECRET is required. ARENA_MATCHUP_SIGNING_SECRET= # Supabase Storage (recommended for large build uploads, e.g. 50-100MB+) # Used by scripts/batch-generate.ts and storage-backed build reads in API routes. SUPABASE_URL= SUPABASE_SERVICE_ROLE_KEY= SUPABASE_STORAGE_BUCKET=builds SUPABASE_STORAGE_PREFIX=imports # AI providers (direct keys - set the ones you have) OPENAI_API_KEY= ANTHROPIC_API_KEY= GOOGLE_AI_API_KEY= MOONSHOT_API_KEY= DEEPSEEK_API_KEY= MINIMAX_API_KEY= XAI_API_KEY= # OpenRouter (alternative/fallback for all providers) # If a direct provider key is missing or fails, OpenRouter will be used as fallback OPENROUTER_API_KEY= # Optional SEO verification token (Google Search Console) GOOGLE_SITE_VERIFICATION= # Optional overrides (defaults are used if unset) # Claude Fable 5 adaptive thinking effort: low | medium | high | xhigh | max ANTHROPIC_FABLE_5_EFFORT=max # Claude Opus 5 adaptive thinking effort: low | medium | high | xhigh | max ANTHROPIC_OPUS_5_EFFORT=max # Claude Sonnet 5 adaptive thinking effort: low | medium | high | xhigh | max ANTHROPIC_SONNET_5_EFFORT=max # Claude Opus 4.8 adaptive thinking effort: low | medium | high | xhigh | max ANTHROPIC_OPUS_4_8_EFFORT=max # Claude Opus 4.7 adaptive thinking effort: low | medium | high | xhigh | max ANTHROPIC_OPUS_4_7_EFFORT=max # Claude Opus 4.6 adaptive thinking effort: low | medium | high | max ANTHROPIC_OPUS_4_6_EFFORT=max # Claude Sonnet 4.6 adaptive thinking effort: low | medium | high | max ANTHROPIC_SONNET_4_6_EFFORT=high # Stream Anthropic responses (recommended for long-thinking runs) ANTHROPIC_STREAM_RESPONSES=1 # Stream OpenAI responses when the caller consumes live deltas (UI paths). # Batch generation uses non-streamed Responses JSON for reliability. OPENAI_STREAM_RESPONSES=1 # DeepSeek V4 Pro defaults to thinking=max and uses up to 384000 output tokens unless MINEBENCH_MAX_OUTPUT_TOKENS lowers it. # Use OpenAI background mode for long-running Responses API models (default true for gpt-5* when not streaming deltas) OPENAI_USE_BACKGROUND_MODE=1 # Poll interval (ms) while waiting on background Responses jobs OPENAI_BACKGROUND_POLL_MS=2000 # Optional timeout overrides (ms) for very long OpenAI runs OPENAI_GPT5_PRO_TIMEOUT_MS=7200000 OPENAI_REQUEST_TIMEOUT_MS= # Enable 1M-context beta header for supported Claude models (Tier 4+ required) ANTHROPIC_ENABLE_1M_CONTEXT_BETA=1 MOONSHOT_BASE_URL="https://api.moonshot.ai" DEEPSEEK_BASE_URL="https://api.deepseek.com" MINIMAX_BASE_URL="https://api.minimax.io/v1" XAI_BASE_URL="https://api.x.ai/v1" OPENROUTER_BASE_URL="https://openrouter.ai/api" # Arena large-build loading controls # Serve preview-first builds from /api/arena/matchup and hydrate full builds in background. ARENA_ARTIFACTS_ENABLED=1 ARENA_PREVIEW_STAGE_ENABLED=1 # Adaptive shell route inlines builds up to this size (bytes). Note: this is per-build, and matchups may inline 2 builds. ARENA_INLINE_INITIAL_MAX_BYTES=2097152 # Estimated full-build byte threshold before matchup serves preview first. ARENA_PREVIEW_TRIGGER_BYTES=262144 # Only builds at/above this JSON byte size are eligible for stream artifact storage. ARENA_ARTIFACT_MIN_BYTES=15728641 # Adaptive shell route uses snapshot (non-stream) up to this size. ARENA_SNAPSHOT_MAX_BYTES=15728640 # Server timeout for artifact fetch before falling back to live stream. ARENA_STREAM_ARTIFACT_FETCH_TIMEOUT_MS=3500 ARENA_SNAPSHOT_ARTIFACT_PREFIX=arena-snapshot/v2-gzip ARENA_STREAM_ARTIFACT_PREFIX=arena-stream/v3-gzip ARENA_SNAPSHOT_ARTIFACT_MISS_TTL_MS=1000 ARENA_STREAM_ARTIFACT_MISS_TTL_MS=1000 ARENA_SNAPSHOT_ARTIFACT_SIGN_TIMEOUT_MS=5000 ARENA_SNAPSHOT_ARTIFACT_SIGN_URL_TTL_SEC=3600 ARENA_SNAPSHOT_ARTIFACT_CACHE_CONTROL=public, max-age=31536000, immutable ARENA_STREAM_ARTIFACT_CACHE_CONTROL=public, max-age=31536000, immutable ARENA_STREAM_ARTIFACT_SIGN_URL_TTL_SEC=3600 # Preview payloads are small enough for same-origin/CDN JSON; avoid storage connection pressure. ARENA_SNAPSHOT_PREVIEW_ARTIFACT_REDIRECT_ENABLED=1 # Target block budget for generated preview build (surface-focused). ARENA_PREVIEW_TARGET_BLOCKS=3000 # In-memory server cache bounds for prepared arena artifacts. ARENA_ARTIFACT_CACHE_MAX_ENTRIES=128 ARENA_ARTIFACT_CACHE_MAX_WEIGHT=600000000 ARENA_MATCHUP_STATE_CACHE_TTL_MS=60000 ARENA_PENDING_SHOWN_COUNT_TTL_MS=90000 ARENA_MATCHUP_SLOW_EVENT_MS=1500 # Wide IP guardrail for many real sessions behind one NAT; per-session buckets remain stricter. ARENA_IP_GUARDRAIL_MULTIPLIER=250 # Build payload URLs are cacheable assets and need a wider shared-IP budget. ARENA_BUILD_IP_GUARDRAIL_MULTIPLIER=1000 # Trust x-forwarded-for only behind a platform proxy that overwrites client-supplied values. ARENA_TRUST_X_FORWARDED_FOR= # Keep matchup responses shell-only under load; builds hydrate through artifact-backed endpoints. ARENA_MATCHUP_INLINE_MAX_BYTES=0 ARENA_MATCHUP_ARTIFACT_URL_WARMING_ENABLED=1 # Set to 0 only when vote jobs are drained by a separate worker/cron. ARENA_VOTE_JOB_DRAIN_AFTER_RESPONSE=1 ARENA_VOTE_JOB_BATCH_LIMIT=128 ARENA_VOTE_JOB_DRAIN_MAX_JOBS=10000 ARENA_VOTE_JOB_DRAIN_MAX_MS=50000 # Client hydration watchdog timeouts (ms). NEXT_PUBLIC_ARENA_MATCHUP_REQUEST_RETRIES=0 NEXT_PUBLIC_ARENA_OVERLAP_MATCHUP_FETCH=0 NEXT_PUBLIC_ARENA_FULL_HYDRATION_SLOW_MS=2500 NEXT_PUBLIC_ARENA_FULL_HYDRATION_RETRY_BASE_MS=1200 NEXT_PUBLIC_ARENA_FULL_HYDRATION_RETRY_MAX_MS=15000 NEXT_PUBLIC_ARENA_PROGRESSIVE_BUILD_UPDATE_MIN_BLOCKS=12000 NEXT_PUBLIC_ARENA_SNAPSHOT_TIMEOUT_MS=12000 NEXT_PUBLIC_ARENA_STREAM_REQUEST_TIMEOUT_MS=12000 NEXT_PUBLIC_ARENA_STREAM_FIRST_EVENT_TIMEOUT_MS=6000 NEXT_PUBLIC_ARENA_STREAM_STALL_TIMEOUT_MS=10000 NEXT_PUBLIC_ARENA_STREAM_HARD_TIMEOUT_MS=35000 NEXT_PUBLIC_ARENA_BUILD_STUCK_AUTOSKIP_MS=45000 NEXT_PUBLIC_VOXEL_LOCAL_MESH_MAX_BLOCKS=8000 NEXT_PUBLIC_VOXEL_REVEAL_ANIMATION_MIN_BLOCKS=12000 NEXT_PUBLIC_VOXEL_MESH_WORKER_TIMEOUT_MS=45000