Site Attendance

Sign in to continue — demo build

RecrHR stores all data — users, locations, shifts, roster, punches, leave and mispunch requests — in a small SQLite database on this server (via api.php), so every device sees the same records. A local browser cache keeps things working if the connection briefly drops.

—

--:--:--
—

PUNCH TERMINAL — LIVE CAMERA

Tap Punch In / Punch Out to
activate the camera
Today's shift—
Assigned location(s)—
Location lock—
Nearest site / distance—
—

TODAY

First punch in—
Last punch out—
Hours worked—
Status—

DEMO OVERRIDES

Punch-in uses your real camera and real GPS by default. Flip these on to reliably show the reject flow during a walkthrough.

Force location outside allowed geofence
Force photo mismatch on capture

Face-matching is simulated in this demo — a production build would call a real face-recognition API against the enrolled profile photo.

—

—

CONTACT

Email—
Employee code—
Profile photoCaptured by admin at enrollment

MONTH CALENDAR

DAY-WISE REGISTER

DateDayShiftInOutHoursLateOTStatusLocation

RAW PUNCH LOG

PhotoDateTypeTimeLocationDistanceStatusReason
No punches recorded in this month.

MY ROSTER

APPLY FOR MISPUNCH CORRECTION

MY REQUESTS

DateTypeRequestedReasonStatus
No mispunch requests yet.

APPLY FOR LEAVE

MY LEAVE HISTORY

TypeFromToDaysStatus
No leave requests yet.
Monthly summary
Late-in & OT
Leave & mispunch

MY MONTHLY ATTENDANCE SUMMARY

DateShiftInOutHoursStatusRemark

MY LATE-IN / EARLY-OUT / OVERTIME

DateShiftShift timeInOutLate byEarly out byOT
Nothing to report for this range.

MY LEAVE LEDGER

TypeFromToDaysReasonStatusRemark
No leave requests yet.

MY MISPUNCH HISTORY

DateTypeRequestedReasonStatusRemark
No mispunch requests yet.

ADD USER

No photo captured

The camera stays live until you press Capture photo — frame the face, check the lighting, then take the shot. Nothing is saved until you capture.

ALL USERS

PhotoNameCodeRoleLocationsActions

ADD LOCATION

150 m

ALL LOCATIONS

NameLatLngRadiusUsersActions
Shift master
Roster grid
Bulk upload (CSV)

ADD SHIFT

SHIFT MASTER

CodeNameTimingGraceFull / HalfRosteredActions

Full day hours is the worked-hours threshold for a day to count as Present — set it slightly below the shift span (e.g. 7.5 for an 8-hour shift) so a normal day isn't marked half-day. Below half day hours the day still counts as half day.

A shift that crosses midnight (e.g. 22:00 → 06:00) is handled as a night shift — hours and late-in are calculated across the day boundary.

PAINT MODE — pick a shift below, then click cells to assign. Click a filled cell with the same shift selected to clear it.

UPLOAD ROSTER CSV

Drop a .csv here, or click to choose a file
Existing entries for the same employee + date are overwritten

EXPECTED FORMAT

employee_code,date,shift_code EMP-104,2026-09-01,A EMP-104,2026-09-02,A EMP-118,2026-09-01,B EMP-118,2026-09-02,OFF

Date accepts YYYY-MM-DD or DD/MM/YYYY. Use shift code OFF (or leave blank) to mark a weekly off. Header row is optional.

LAST IMPORT RESULT

No file imported yet.

DAILY ATTENDANCE REGISTER

PhotoEmployeeCodeShiftInOutHoursLateOTStatusLocationPunches
0
Punches in range
0
Approved
0
Rejected

PUNCH LOGS

PhotoEmployeeTypeDateTimeLocationDistanceStatusReason
No punches match these filters.

MISPUNCH REQUESTS

EmployeeDateTypeRequestedReasonStatusAction
No mispunch requests submitted yet.

LEAVE REQUESTS

EmployeeTypeFromToDaysReasonStatusAction
No leave requests submitted yet.
Monthly summary
Daily muster
Late-in & OT
Leave & mispunch

MONTHLY ATTENDANCE SUMMARY — ALL EMPLOYEES

EmployeeCodeRosteredPresentHalf dayAbsentLeaveWeekly offLateEarly outTotal hrsOT hrsAtt %

DAILY MUSTER REGISTER

DateEmployeeCodeShiftInOutHoursStatusLocation

LATE-IN, EARLY-OUT & OVERTIME

DateEmployeeShiftShift timeInOutLate byEarly out byOT

LEAVE & MISPUNCH SUMMARY

EmployeeCodeCL takenCL balSL takenSL balEL takenEL balPending lvRejected lvMispunch reqMP approvedMP pending

BACKUP & RESTORE

The database lives in a SQLite file on this server (data/recrhr.sqlite), so every device and browser shares the same records. Still worth taking a JSON backup before anything risky — it's the fastest way to move data or recover from a mistake.

STORAGE USED

TableRecordsSize

Punch photos are compressed to a small thumbnail before saving. The database has plenty of headroom on typical hosting, but "Purge photos" below is there if the SQLite file ever grows larger than you'd like — it clears photo data while keeping the punch record itself.

MAINTENANCE

DANGER ZONE

“Clear all transactions” removes punches, leave and mispunch requests but keeps users, locations, shifts and roster. “Reset” restores the factory demo dataset.