Attendance systems often stop at forms or QR codes, which can be shared around. I wanted to test a more accountable flow where the check-in is tied to a real face, a live person, and the employee's assigned shift.
How I fixed it
I split the app into a public kiosk and an admin workspace. Face descriptors are extracted in the browser, matched server-side through Supabase pgvector RPCs, then written through protected server routes after liveness and shift checks pass.
What it can do
✓Public face-recognition kiosk
✓Head-movement liveness check
✓Server-side pgvector face matching
✓Shift and schedule management
✓Realtime attendance dashboard
✓Monthly PDF report export
The stack that shipped it
Next.js keeps kiosk, admin, and server routes in one codebase. Supabase gives Auth, Postgres, Realtime, and pgvector; TensorFlow plus face-api.js handles recognition without sending raw images to a third-party model.
What changed
Presence shows that I can combine AI-in-the-browser, database security, realtime dashboards, and reporting into one production-shaped system.
What I learned
I learned that face recognition is mostly an operations problem: calibration, duplicate checks, security boundaries, and clear feedback matter as much as the model itself.