- Single mobile app with teacher/student roles
- FastAPI + PostgreSQL backend
- Android-first delivery with iOS-safe constraints from start
- Local login and end-of-session biometric confirmation
- Teacher logs in and starts a lecture session.
- Backend creates active session and issues token.
- Teacher app advertises token over BLE.
- Student app scans and detects token repeatedly.
- Student app submits
session_id, RSSI, and proximity flag to backend. - Session ends by teacher.
- Student confirms identity with biometrics and finalizes attendance.
users(teacher or student)sessions(single active session per teacher)detections(time-stamped RSSI samples)attendance(presence ratio + biometric status)
- Window size: 30 seconds
- ratio = valid detections / elapsed windows
- present if ratio >= 0.6
- Student app should be foreground/background active and not force-killed
- BLE behavior when force-killed is not guaranteed by iOS
- Early iOS spike should validate scan reliability on one physical device
- API: Render free tier
- DB: Supabase or Neon free Postgres
- Alternative: expose local API with Cloudflare Tunnel