Welcome back
Sign in with your ABHA credentials or staff email
Mobile OTP Login
Enter your registered ABDM mobile number
Verify OTP
Enter the 6-digit OTP sent to your registered mobile
Select a patient to view their dashboard.
Record new vital signs reading
BP classification (AHA/ACC 2017)
Select a patient to view history.
Add new patient
ABHA number and ABHA address are required for ABDM compliance
Registered patients
Consent Manager (HIE-CM)
Manage patient consent for data sharing per ABDM HIE-CM guidelines. All health data exchange requires explicit patient consent.
Select a patient to manage consent.
Purpose of use codes (ABDM)
📄 PDF Report Export
Generate a clinical PDF report for any patient — includes readings history, statistics, trend chart and ABDM compliance status
FHIR R4 Bundle Export
Export patient health records as HL7 FHIR R4 compliant WellnessRecord bundles per ABDM Implementation Guide v6.5.0
ABDM compliance checklist
Tech stack, architecture, database-to-FHIR mapping, CI/CD pipeline, and repository structure — everything your team needs to understand, maintain, and extend this system.
| Actor | Step | System | Data / Output |
|---|---|---|---|
| 👤 Clinician | Opens app, logs in with email + password | Frontend PWA | POST /api/auth/token → JWT |
| 🌐 nginx | Receives POST, exact-match location = /api/auth/token | nginx config | Proxies to FastAPI :8000/auth/token |
| ⚡ FastAPI | Validates credentials, checks bcrypt hash (cost=12) | auth.py · passlib · python-jose | Returns JWT (30 min expiry, sub=user_id) |
| 👤 Clinician | Selects patient, enters systolic/diastolic/pulse, body site, position | Frontend — Log Reading tab | Form data collected in browser |
| 🌐 nginx | Receives POST /api/readings, rewrites to /readings via rewrite directive | location /api/ rewrite ^/api/(.*)$ /$1 | Proxies to http://$api_host:8000 |
| ⚡ FastAPI | Validates JWT, checks role (CLINICIAN/ADMIN), validates Pydantic schema | main.py · schemas.py | BPReadingCreate schema validated |
| ⚡ FastAPI | Persists reading to database via async SQLAlchemy | orm_models.py · aiomysql driver | INSERT into bp_readings |
| 🗄 MariaDB | Stores reading row | bp_readings table · InnoDB | systolic, diastolic, pulse, body_site_code, position_code, loinc_bp, loinc_sys, loinc_dia, loinc_hr |
| ⚡ FastAPI | Checks for crisis BP (systolic >180 mmHg) | alerts.py · Brevo API | Sends email/SMS alert if BREVO_API_KEY configured |
| ⚡ FastAPI | Writes audit log entry | audit_logs table | user_id, action=CREATE, resource_type=BPReading, ip_address |
| 📊 Prometheus | Scrapes /metrics endpoint every 15 seconds | prometheus_fastapi_instrumentator | http_requests_total, http_request_duration_seconds by handler+method+status |
| 👤 Clinician | Exports FHIR bundle for patient | Frontend — FHIR Export tab | GET /api/fhir/{patient_id} |
| ⚡ FastAPI | Loads patient + all readings from DB, builds WellnessRecord bundle | fhir_builder.py | Bundle with 1 Patient + N Observation resources, NRCeS profiles |
Every BP reading maps to a FHIR R4 WellnessRecord Bundle per NRCeS ABDM IG v6.5.0. The bundle wraps one Patient resource and one Observation per reading.
git push to main on GitLab. Stage 5 requires manual approval.