Skip to content

Repository files navigation

CrewClock

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).

Highlights

  • 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.

Stack

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.

Self-host quick start

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:3000

Seeded 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).

Verify

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)

License

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.

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages