| # ---- 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 | |