Attendance, leave and payroll for shops and field teams. Geofenced check-ins, a shared kiosk tablet, advance recovery and printable salary slips, on a multi-tenant PWA and a branded Android app.
The problem
The client runs a trading business with shop staff and people out in the field. Attendance lived in WhatsApp screenshots. Leave requests were buried in group chats. Payroll was built at month end from a half-updated sheet, and cash advances to staff were tracked from memory.
What I built
VTClock is a multi-tenant workforce app with two surfaces: an admin panel and an employee app that installs on a phone.
- Attendance. Staff check in and out near their assigned office. The engine handles shift grace, a monthly late allowance, half days, overnight shifts and forgotten check-outs.
- Kiosk mode. Many shop helpers don't own a smartphone. A spare tablet at the counter becomes a shared punch station: tap your face, enter a PIN, the camera takes a selfie.
- Leave. Staff apply with dates, type and attachments. Admins approve, reject or mark loss of pay.
- Payroll. Salary is built from days actually worked, with holidays, weekly offs, LOP and a per-employee advance ledger that recovers over several months. Salary slips print with the remaining advance balance.
- Field visits and daily wagers. Optional modules for teams that visit sites with photo and location proof, and for one-day workers who never join the payroll.
Admins get an inbox, Web Push on desktop and tray notifications on Android.
How it works
The backend is Go on the standard library, with MongoDB. Every record is scoped to an organization, and each business gets its own subdomain. Auth is in-house: Argon2-hashed login codes, short-lived JWTs, and refresh tokens with rotation and reuse detection.
Check-ins are verified server-side with a Haversine distance check against the office radius, and suspicious location data is flagged for the admin. Kiosk punches rely on device pairing, PIN and selfie.
The service first shipped on Python and FastAPI. I rewrote it in Go in July 2026, gated by a differential HTTP harness that compared both backends response for response until they matched, then cut over.
The Android app is a Capacitor shell that loads the live web app, so a frontend deploy updates every phone without a rebuild. Each business gets its own icon and launcher name. Playwright end-to-end tests cover the admin and employee flows.
Outcome
Live in production since July 2026, with a marketing site, the web app, and a branded Android build per business. Work since launch has gone into the advance ledger, kiosk mode, field visits and location pings, driven by what the client's staff hit day to day.
Need something like this built? contact@akhilsingh.in