APP_NAME=Laravel APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://localhost APP_LOCALE=en APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US APP_MAINTENANCE_DRIVER=file # APP_MAINTENANCE_STORE=database # PHP_CLI_SERVER_WORKERS=4 BCRYPT_ROUNDS=12 LOG_CHANNEL=stack LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=skinbase26 DB_USERNAME=root DB_PASSWORD= # Legacy database connection (projekti_old_skinbase) LEGACY_DB_CONNECTION=mysql LEGACY_DB_HOST=127.0.0.1 LEGACY_DB_PORT=3306 LEGACY_DB_DATABASE=projekti_old_skinbase LEGACY_DB_USERNAME=root LEGACY_DB_PASSWORD= SESSION_DRIVER=database SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null BROADCAST_CONNECTION=log FILESYSTEM_DISK=local QUEUE_CONNECTION=database # Upload UI feature flag (legacy upload remains default unless explicitly enabled) SKINBASE_UPLOADS_V2=false # Draft abuse prevention controls SKINBASE_MAX_DRAFTS=10 SKINBASE_MAX_DRAFT_STORAGE_MB=1024 SKINBASE_DUPLICATE_HASH_POLICY=block # Vision / AI auto-tagging (local defaults) VISION_ENABLED=true VISION_QUEUE=default VISION_IMAGE_VARIANT=md # CLIP service (set base URL to enable CLIP calls) CLIP_BASE_URL= CLIP_ANALYZE_ENDPOINT=/analyze CLIP_TIMEOUT_SECONDS=8 CLIP_CONNECT_TIMEOUT_SECONDS=2 CLIP_HTTP_RETRIES=1 CLIP_HTTP_RETRY_DELAY_MS=200 CLIP_EMBED_ENDPOINT=/embed CLIP_EMBED_TIMEOUT_SECONDS=8 CLIP_EMBED_CONNECT_TIMEOUT_SECONDS=2 CLIP_EMBED_HTTP_RETRIES=1 CLIP_EMBED_HTTP_RETRY_DELAY_MS=200 # Similar artworks / embedding pipeline RECOMMENDATIONS_QUEUE=${VISION_QUEUE} RECOMMENDATIONS_EMBEDDING_ENABLED=true RECOMMENDATIONS_EMBEDDING_MODEL=clip RECOMMENDATIONS_EMBEDDING_MODEL_VERSION=v1 RECOMMENDATIONS_ALGO_VERSION=clip-cosine-v1 RECOMMENDATIONS_AB_ALGO_VERSIONS=clip-cosine-v1 RECOMMENDATIONS_MIN_DIM=64 RECOMMENDATIONS_MAX_DIM=4096 RECOMMENDATIONS_BACKFILL_BATCH=200 # Personalized discovery foundation (Phase 8) DISCOVERY_QUEUE=${RECOMMENDATIONS_QUEUE} DISCOVERY_PROFILE_VERSION=profile-v1 DISCOVERY_EVENT_VERSION=event-v1 DISCOVERY_ALGO_VERSION=${RECOMMENDATIONS_ALGO_VERSION} DISCOVERY_CACHE_VERSION=cache-v1 DISCOVERY_DECAY_HALF_LIFE_HOURS=72 DISCOVERY_WEIGHT_VIEW=1 DISCOVERY_WEIGHT_CLICK=2 DISCOVERY_WEIGHT_FAVORITE=4 DISCOVERY_WEIGHT_DOWNLOAD=3 DISCOVERY_CACHE_TTL_MINUTES=60 DISCOVERY_RANKING_WEIGHTS_VERSION=rank-w-v1 DISCOVERY_RANKING_W1=0.65 DISCOVERY_RANKING_W2=0.20 DISCOVERY_RANKING_W3=0.10 DISCOVERY_RANKING_W4=0.05 DISCOVERY_RANKING_WEIGHTS_VERSION_CLIP_COSINE_V1=rank-w-v1 DISCOVERY_RANKING_W1_CLIP_COSINE_V1=0.65 DISCOVERY_RANKING_W2_CLIP_COSINE_V1=0.20 DISCOVERY_RANKING_W3_CLIP_COSINE_V1=0.10 DISCOVERY_RANKING_W4_CLIP_COSINE_V1=0.05 DISCOVERY_RANKING_WEIGHTS_VERSION_CLIP_COSINE_V2=rank-w-v2-prod-1 DISCOVERY_RANKING_W1_CLIP_COSINE_V2=0.52 DISCOVERY_RANKING_W2_CLIP_COSINE_V2=0.23 DISCOVERY_RANKING_W3_CLIP_COSINE_V2=0.15 DISCOVERY_RANKING_W4_CLIP_COSINE_V2=0.10 DISCOVERY_ROLLOUT_ENABLED=false DISCOVERY_ROLLOUT_BASELINE_ALGO_VERSION=clip-cosine-v1 DISCOVERY_ROLLOUT_CANDIDATE_ALGO_VERSION=clip-cosine-v2 DISCOVERY_ROLLOUT_ACTIVE_GATE=g10 DISCOVERY_ROLLOUT_GATE_10_PERCENT=10 DISCOVERY_ROLLOUT_GATE_50_PERCENT=50 DISCOVERY_ROLLOUT_GATE_100_PERCENT=100 DISCOVERY_FORCE_ALGO_VERSION= DISCOVERY_ROLLOUT_WARN_CTR_DROP_PCT=3 DISCOVERY_ROLLOUT_ROLLBACK_CTR_DROP_PCT=5 DISCOVERY_ROLLOUT_WARN_LONG_DWELL_DROP_PCT=4 DISCOVERY_ROLLOUT_ROLLBACK_LONG_DWELL_DROP_PCT=8 DISCOVERY_ROLLOUT_WARN_DIVERSITY_CONCENTRATION_RISE_PCT=10 DISCOVERY_ROLLOUT_ROLLBACK_DIVERSITY_CONCENTRATION_RISE_PCT=15 DISCOVERY_EVAL_WEIGHT_CTR=0.45 DISCOVERY_EVAL_WEIGHT_SAVE_RATE=0.35 DISCOVERY_EVAL_WEIGHT_LONG_DWELL=0.25 DISCOVERY_EVAL_WEIGHT_BOUNCE_PENALTY=0.15 DISCOVERY_EVAL_SAVE_RATE_INFORMATIONAL=true # YOLO service (optional) YOLO_ENABLED=true YOLO_BASE_URL= YOLO_ANALYZE_ENDPOINT=/analyze YOLO_TIMEOUT_SECONDS=8 YOLO_CONNECT_TIMEOUT_SECONDS=2 YOLO_HTTP_RETRIES=1 YOLO_HTTP_RETRY_DELAY_MS=200 YOLO_PHOTOGRAPHY_ONLY=true # ----------------------------------------------------------------------------- # Production examples (uncomment and adjust) # ----------------------------------------------------------------------------- # VISION_ENABLED=true # VISION_QUEUE=vision # VISION_IMAGE_VARIANT=md # # CLIP_BASE_URL=https://clip.internal # CLIP_ANALYZE_ENDPOINT=/analyze # CLIP_TIMEOUT_SECONDS=5 # CLIP_CONNECT_TIMEOUT_SECONDS=1 # CLIP_HTTP_RETRIES=1 # CLIP_HTTP_RETRY_DELAY_MS=150 # CLIP_EMBED_ENDPOINT=/embed # CLIP_EMBED_TIMEOUT_SECONDS=5 # CLIP_EMBED_CONNECT_TIMEOUT_SECONDS=1 # CLIP_EMBED_HTTP_RETRIES=1 # CLIP_EMBED_HTTP_RETRY_DELAY_MS=150 # RECOMMENDATIONS_QUEUE=vision # RECOMMENDATIONS_EMBEDDING_ENABLED=true # RECOMMENDATIONS_EMBEDDING_MODEL=clip # RECOMMENDATIONS_EMBEDDING_MODEL_VERSION=v1 # RECOMMENDATIONS_ALGO_VERSION=clip-cosine-v1 # RECOMMENDATIONS_AB_ALGO_VERSIONS=clip-cosine-v1,clip-cosine-v2 # RECOMMENDATIONS_BACKFILL_BATCH=250 # DISCOVERY_QUEUE=vision # DISCOVERY_PROFILE_VERSION=profile-v1 # DISCOVERY_EVENT_VERSION=event-v1 # DISCOVERY_ALGO_VERSION=clip-cosine-v1 # DISCOVERY_CACHE_VERSION=cache-v1 # DISCOVERY_DECAY_HALF_LIFE_HOURS=72 # DISCOVERY_WEIGHT_VIEW=1 # DISCOVERY_WEIGHT_CLICK=2 # DISCOVERY_WEIGHT_FAVORITE=4 # DISCOVERY_WEIGHT_DOWNLOAD=3 # DISCOVERY_RANKING_WEIGHTS_VERSION=rank-w-v1 # DISCOVERY_RANKING_W1=0.65 # DISCOVERY_RANKING_W2=0.20 # DISCOVERY_RANKING_W3=0.10 # DISCOVERY_RANKING_W4=0.05 # # YOLO_ENABLED=true # YOLO_BASE_URL=https://yolo.internal # YOLO_ANALYZE_ENDPOINT=/analyze # YOLO_TIMEOUT_SECONDS=5 # YOLO_CONNECT_TIMEOUT_SECONDS=1 # YOLO_HTTP_RETRIES=1 # YOLO_HTTP_RETRY_DELAY_MS=150 # YOLO_PHOTOGRAPHY_ONLY=true CACHE_STORE=database # CACHE_PREFIX= MEMCACHED_HOST=127.0.0.1 REDIS_CLIENT=phpredis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=log MAIL_SCHEME=null MAIL_HOST=127.0.0.1 MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_FROM_ADDRESS="hello@example.com" MAIL_FROM_NAME="${APP_NAME}" # Registration anti-spam REGISTRATION_IP_PER_MINUTE_LIMIT=3 REGISTRATION_IP_PER_DAY_LIMIT=20 REGISTRATION_EMAIL_PER_MINUTE_LIMIT=6 REGISTRATION_EMAIL_COOLDOWN_MINUTES=30 REGISTRATION_VERIFY_TOKEN_TTL_HOURS=24 REGISTRATION_ENABLE_TURNSTILE=true REGISTRATION_DISPOSABLE_DOMAINS_ENABLED=true REGISTRATION_TURNSTILE_SUSPICIOUS_ATTEMPTS=2 REGISTRATION_TURNSTILE_ATTEMPT_WINDOW_MINUTES=30 REGISTRATION_EMAIL_GLOBAL_SEND_PER_MINUTE=30 REGISTRATION_MONTHLY_EMAIL_LIMIT=10000 TURNSTILE_SITE_KEY= TURNSTILE_SECRET_KEY= TURNSTILE_VERIFY_URL=https://challenges.cloudflare.com/turnstile/v0/siteverify TURNSTILE_TIMEOUT=5 AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" # ─── Early-Stage Growth System ─────────────────────────────────────────────── # Set NOVA_EARLY_GROWTH_ENABLED=false to instantly revert to normal behaviour. # NOVA_EARLY_GROWTH_MODE: off | light | aggressive NOVA_EARLY_GROWTH_ENABLED=false NOVA_EARLY_GROWTH_MODE=off # Module toggles (only active when NOVA_EARLY_GROWTH_ENABLED=true) NOVA_EGS_ADAPTIVE_WINDOW=true NOVA_EGS_GRID_FILLER=true NOVA_EGS_SPOTLIGHT=true NOVA_EGS_ACTIVITY_LAYER=false # AdaptiveTimeWindow thresholds NOVA_EGS_UPLOADS_PER_DAY_NARROW=10 NOVA_EGS_UPLOADS_PER_DAY_WIDE=3 NOVA_EGS_WINDOW_NARROW_DAYS=7 NOVA_EGS_WINDOW_MEDIUM_DAYS=30 NOVA_EGS_WINDOW_WIDE_DAYS=90 # GridFiller minimum items per page NOVA_EGS_GRID_MIN_RESULTS=12 # Auto-disable when site reaches organic scale NOVA_EGS_AUTO_DISABLE=false NOVA_EGS_AUTO_DISABLE_UPLOADS=50 NOVA_EGS_AUTO_DISABLE_USERS=500 # Cache TTLs (seconds) NOVA_EGS_SPOTLIGHT_TTL=3600 NOVA_EGS_BLEND_TTL=300 NOVA_EGS_WINDOW_TTL=600 NOVA_EGS_ACTIVITY_TTL=1800