# ---- PawTrace configuration (copy to .env and edit) ---- # Never commit your real .env. Every value below is the application default, so the app runs # with no .env at all. # Database (SQLite file by default; swap for postgres+pgvector later) DATABASE_URL=sqlite:///./data/app.db # Storage MEDIA_DIR=./data/media STORAGE_BACKEND=local # local | s3 # ---- Embedder ---- # mock = deterministic stand-in, no weights and no downloads (what the test suite uses) # hf = pooled features from the HuggingFace breed model below # reid = the fine-tuned re-identification checkpoint at REID_MODEL_PATH (what the demo runs) EMBEDDER=mock # mock | hf | reid EMBEDDER_HF_MODEL=jhoppanne/Dogs-Breed-Image-Classification-V1 REID_MODEL_PATH=./best.pt REID_MODEL_VERSION=v4 # tagged onto stored vectors so model generations never mix # ---- Breed classifier ---- # Separate from image matching. hf downloads ~43 MB from HuggingFace on first use. BREED_CLASSIFIER=mock # mock | hf BREED_MODEL=jhoppanne/Dogs-Breed-Image-Classification-V1 BREED_TOP_K=7 # top predicted breeds kept per image (5-10) BREED_FILTER_ENABLED=true # match-time breed gate (case matcher only, not photo search) # Matching thresholds for the CASE matcher (lost-case review + strong-match notification). # The public photo search ignores them: it always returns the top N with no score cutoff. TOP_N=10 REVIEW_THRESHOLD=0.55 STRONG_THRESHOLD=0.80 # Location radius levels in miles; -1 means nationwide (no distance filter) RADIUS_LEVELS=0,10,25,50,100,-1 # Image limits MAX_IMAGE_MB=25 MAX_PHOTOS_PER_DOG=8 MAX_IMAGE_LONGEST_SIDE=1024 # ---- Demo ---- # DEMO_MODE=true makes the whole app read-only: middleware rejects every mutating request except # the two photo-search endpoints, which persist nothing. This is how the public demo runs. DEMO_MODE=false SEED_DEMO=false # Notifications NOTIFIER=console # console | smtp SMTP_HOST= SMTP_PORT=1025 SMTP_USER= SMTP_PASSWORD= SMTP_FROM=no-reply@pawtrace.local # SMS (off by default — paid + network, do not enable without confirmation) SMS_ENABLED=false TWILIO_ACCOUNT_SID= TWILIO_AUTH_TOKEN= TWILIO_FROM= # Auth # Leave blank and a random secret is generated per process (safe, but logins do not survive a # restart). Set a real value for any deployment where sessions must persist. JWT_SECRET= JWT_ALGORITHM=HS256 ACCESS_TOKEN_TTL_MINUTES=1440 # Geo ZIP_CENTROID_FILE=./data/zip_centroids.csv # Misc RATE_LIMIT_REPORTS_PER_MINUTE=10 CORS_ORIGINS=http://localhost:5173