Technician time tracking with GPS proof of presence — built for the trades. Field crews clock in and out from their phones; the office gets defensible hours, job costing, and WH-347 certified payroll. Geofencing is record-and-flag by default (a location problem never stops someone getting paid), so it's honest with technicians and still gives the office the audit trail it needs.
▶ Live demo: cas-tx.com/crewclock — the owner login is prefilled on the screen. Sample data only.
Part of the CAS-TX open-source trades suite, alongside CrewBooks (the books that pair with it) and Peal (the phone system).
- Geofenced GPS punches with accuracy-aware verdicts (a punch inside the fix's error margin is
EDGE, never a false violation) + breadcrumb trails and a live crew map (Leaflet/OSM — no mapping-API bill, no location data handed to a third party). - Anti-fraud that stays humble — punch selfie, device binding, and a spoof score that hands a human the reasons ("review this", never an accusation).
- Offline-first — a cold-start offline punch page + IndexedDB queue that drains on reconnect, so a dead-signal job site never loses a punch. Installable PWA.
- Payroll that's actually correct — FLSA / California overtime, per-job & per-classification prevailing-wage rates (blended vs. rate-in-effect), job costing, and WH-347 certified payroll.
- Kiosk + crew punch, approvals & exceptions, immutable audit trail on every correction.
- Bilingual EN/ES field UI (the office surfaces stay English).
- Multi-tenant — every record is org-scoped.
Next.js 16 (App Router, Server Actions) · Prisma 7 / PostgreSQL (pg driver adapter) · Tailwind v4 ·
Leaflet + OpenStreetMap · self-hosted email/password auth (JWT cookie, jose + bcryptjs) · PWA
(manifest + service worker + IndexedDB offline queue). No paid third-party services required to run it.
npm install
cp .env.example .env # set AUTH_SECRET: openssl rand -base64 32
createdb crew_clock # or point DATABASE_URL at your Postgres
npm run db:deploy && npm run db:seed
npm run dev # http://localhost:3000Seeded logins print at the end of the seed (all share one demo password; kiosk PIN 1234). See
INSTALL.md for a production/self-host walkthrough and CODEMAP.md to
navigate the code. Web Push and reverse geocoding are optional (the app no-ops cleanly without keys).
npm test # the pure engines (geofence, overtime, pay, time, efficiency…)
npm run build # typecheck + production build
npm run test:e2e # browser checks (injects geolocation + a synthetic webcam)AGPL-3.0-or-later — see LICENSE. If you run a modified version as a network service,
the AGPL requires you to offer your changes' source to its users. Managed hosting and paid installs of
the upstream are offered separately. Contributions welcome — see CONTRIBUTING.md.