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.