fastapi>=0.115,<1
uvicorn[standard]>=0.32,<1
gunicorn>=23,<24
sqlalchemy>=2.0,<3
alembic>=1.13,<2
psycopg[binary]>=3.2,<4
pydantic-settings>=2.6,<3
passlib[bcrypt]>=1.7,<2
# passlibs interne bcrypt-Selbsttest-Routine bricht mit bcrypt>=4.1 (siehe
# https://github.com/pyca/bcrypt/issues/684) - bewusst gepinnt statt auf einen
# passlib-Fix zu warten (Projekt wirkt unmaintained, letzter Release 2020)
bcrypt<4.1
python-multipart>=0.0.12
jinja2>=3.1,<4
weasyprint>=63,<64
itsdangerous>=2.2,<3
httpx>=0.27,<1
# -headless statt normal: keine GUI-Abhaengigkeiten (libGL etc.) noetig, die
# der Container ohnehin nie nutzt - fuer die Dokumenten-Scan-Kantenerkennung
# (app/dokument_scan.py)
opencv-python-headless>=4.10,<5
# Python-Wrapper fuer die tesseract-ocr-Binary (Dockerfile) - eGK-Scan
# (app/egk_ocr.py)
pytesseract>=0.3,<1
# Mehrseitige, durchsuchbare Dokumenten-Scan-PDFs zusammenfuegen (T30,
# app/dokument_scan.py) - reine PDF-Seiten-Konkatenation, kein Rendering
# noetig, daher pypdf statt des schwereren PyMuPDF/fitz.
pypdf>=5,<6
# Volltextsuche fuer normal hochgeladene PDFs (T30-Erweiterung,
# app/dokument_scan.py: pdf_text_extrahieren()) - anders als beim reinen
# Seiten-Zusammenfuegen oben wird hier tatsaechlich eine PDF-Seite als Bild
# gerendert (OCR-Fallback fuer Seiten ohne eigene Textebene), das kann pypdf
# nicht - PyMuPDF ist dafuer die schlankere Wahl gegenueber pdf2image+
# poppler-utils (kein zusaetzliches System-Paket im Dockerfile noetig).
PyMuPDF>=1.24,<2
