# Core recommender stack
rectools[lightfm]==0.13.0
implicit==0.7.3
pandas==2.3.3
numpy==1.26.4
scipy==1.12.0
scikit-learn==1.9.0

# Configurable I/O: static datasets (S3/R2-compatible or local files) or a
# database (input can be read straight from a Postgres source; output can
# be written to a Postgres table).
# Keep boto3 within aiobotocore's botocore pin (s3fs → aiobotocore 3.9 needs
# botocore<1.43.57). Do not bump boto3 past 1.43.56 until aiobotocore allows
# a matching botocore (Dependabot #71 blocked).
boto3==1.43.56
s3fs==2026.7.0
pyarrow==25.0.1
SQLAlchemy==2.0.52
psycopg[binary]==3.3.4

# Cron-in-container scheduler (no system cron daemon needed)
croniter==6.2.4

# Serve mode's read API + the event-driven retrain trigger's webhook
fastapi==0.141.1
uvicorn[standard]==0.52.3
prometheus-client==0.26.0

# Dashboard: server-rendered status page (Jinja2 templates) + HTTP Basic
# Auth password hashing (bcrypt) for its small set of named users
# (see cicerone.dashboard_users / cicerone.manage_dashboard_users)
jinja2==3.1.6
bcrypt==5.0.0
