The network is not a given.
A field executive in a basement warehouse, a rural highway, or a factory floor has no usable connectivity for hours at a time. Any design that assumes an online API call at the moment of check-in loses data.
TraceOn tracks attendance and field movement for people who don't sit at a desk — sales teams, service engineers, distribution staff, site supervisors. We built it around a single assumption: the phone will lose signal, the battery will be low, and the data still has to be right.
Attendance software for office staff is a solved problem. Point a laptop at a login page and you're done. Field attendance is different — four constraints shaped every decision we made.
A field executive in a basement warehouse, a rural highway, or a factory floor has no usable connectivity for hours at a time. Any design that assumes an online API call at the moment of check-in loses data.
Android and iOS aggressively suspend background apps to protect battery. An app that naively polls GPS every minute either gets killed or drains the phone by lunchtime — and a drained phone is an untracked employee.
Mock-location apps are one Play Store search away. Attendance data that can be trivially faked is worse than no data, because it looks authoritative.
Companies aren't flat lists of employees. They have branches, designations, reporting lines, and managers who must see their own team and nothing else. Multiple companies share the same infrastructure and must never share a single row of data.
Everything below is how we answered these four.
The TraceOn mobile app, built in Flutter for Android, captures attendance and location, queues it locally, and syncs it. The React and TypeScript admin portal monitors, reports and configures. Both talk over HTTPS with JWT authentication — the mobile app in resumable batches — to TraceOn Core, a NestJS TypeScript API layer that handles auth, tenancy and business rules. The API and a set of background services (staleness watchdog, session auto-close, cleanup) both read and write a tenant-isolated PostgreSQL database through Prisma. The API also integrates with a customer's HR or SSO system. Background services send push and email, and push is used to silently wake the mobile app's background service.
Every byte the mobile app produces and every screen the portal renders goes through one API, one permission model, one database. There is no second source of truth to reconcile.
[ Mobile App ] [ Admin Portal ]
Flutter/Android React/TypeScript
capture · queue · sync monitor · report · configure
| |
| HTTPS + JWT (batched, resumable) | HTTPS + JWT
+------------------+-----------------------+
|
[ TraceOn Core — NestJS ]
auth · tenancy · business rules
|
[ PostgreSQL via Prisma ]
|
[ Background services: watchdog · auto-close ]
|
push / email · customer HR & SSO
"The network is an optimisation, never a dependency."
The problem. If a check-in only exists after a successful HTTP call, then a dead zone means a lost day — and a manual correction later, which is exactly the manual process the product was meant to remove.
How we solved it. The mobile app treats local storage as the system of record until the server confirms otherwise.
Field staff in low-coverage areas produce the same quality of attendance record as staff sitting in your head office. Your operations team stops arbitrating "my phone had no signal" disputes, because the trail was captured whether or not the network was there.
Breadcrumbs accumulate in the local store. Bounded, self-trimming, queued as one complete session.
The problem. Continuous GPS is the fastest way to drain a phone, and modern Android will kill an app that tries. Either failure mode ends the same way — the employee turns tracking off.
How we solved it. Hybrid tracking, plus a server that notices when a device goes quiet.
Coverage stays high without the battery complaints that kill adoption of tracking products. And when a device does go dark, your system knows and acts — rather than discovering the gap in a report a week later.
"A drained phone is an untracked employee."
The problem. Attendance data drives payroll, incentives and performance reviews. If it can be faked, every decision made from it is contestable.
How we solved it. We don't just capture where the phone says it is — we capture how much that claim can be trusted.
When an attendance record is challenged — by an employee, an auditor, or your own finance team — you can show the full trail, its origin, and its integrity flags. That's the difference between data and evidence.
Nothing floats free of its session. The origin and the doubt travel with the point.
"Data becomes evidence when you can show where it came from."
— no connection · not one shared row —
A recursive query walks the viewer's actual reporting subtree on every request. Promote someone, and the scope is correct on the next page load.
The problem. Multi-tenant SaaS fails in two directions: leaking one customer's data into another's, and giving every manager inside a customer the same god-view of the whole company.
Your reporting structure is reflected in the software instead of being flattened by it — and your data isolation isn't a policy promise, it's how the queries are written.
| Layer | Technology | Why |
|---|---|---|
| Mobile app | Flutter (Dart), Android-first | One codebase, native-grade access to background services, foreground notifications and GPS — the things this product actually depends on |
| Location & background | Native foreground service, platform channels, push-based wake-up | Battery and OS survival can't be solved at the framework layer alone; we drop to platform APIs where it counts |
| Admin portal | React 18, TypeScript, Vite | Fast, type-safe, and quick to iterate as customers ask for new reports |
| Portal UI | Tailwind CSS + HeroUI, Leaflet maps, React Flow org charts | A consistent design system, open mapping with no per-view licensing surprises, and an interactive hierarchy view |
| API | NestJS 11 on Node.js 22, TypeScript | Structured modules, dependency injection and guards — a framework that makes a growing permission model tractable instead of tangled |
| Data | PostgreSQL with Prisma ORM | Relational integrity for a hierarchy-heavy, audit-heavy domain; type-safe queries and versioned migrations |
| Auth | In-house auth SDK, signed JWT access + refresh tokens | Shared across our products, so identity behaves identically everywhere |
| Messaging | Push notifications and templated transactional email | Silent device wake-ups, alerts and onboarding mail through one service |
| Delivery | Containerised, deployed to AWS through automated CI on merge | Reproducible builds; the same image runs in every environment |
One codebase, native-grade access to background services, foreground notifications and GPS.
Battery and OS survival can't be solved at the framework layer alone.
Fast, type-safe, and quick to iterate as customers ask for new reports.
A consistent design system, open mapping, and an interactive hierarchy view.
Modules, DI and guards make a growing permission model tractable.
Relational integrity for a hierarchy-heavy, audit-heavy domain.
Shared across our products, so identity behaves identically everywhere.
Silent wake-ups, alerts and onboarding mail through one service.
Reproducible builds; the same image runs in every environment.
Everything is TypeScript from the database schema to the browser. A change to the data model surfaces as a compile error in the portal, not as a bug in production.
Every endpoint is defined once and published as live OpenAPI documentation. The web portal and mobile app are both consumers of that contract — which is also why integrating a third system is a matter of days, not a project.
Requests are validated against strict schemas at the edge; unknown fields are rejected rather than ignored, which closes off an entire class of mass-assignment bugs.
Structured JSON logging with a correlation ID follows a single request across the whole system, tagged with the acting user and role. Credentials, tokens and passwords are redacted before anything is written. When something goes wrong, we can reconstruct exactly what happened.
Rate limiting is applied per endpoint and tuned to how each one is actually used — a login attempt and a high-frequency location ping have very different profiles. Cross-origin access is restricted to known origins.
Operations that touch multiple tables — check-out, bulk import, hierarchy reordering — run inside transactions. Partial writes don't happen.
Our authentication SDK and communication service are used by every product we build. They arrive at TraceOn already hardened by other deployments.
Who's present, who's active right now, who's absent — scoped automatically to what the viewer is allowed to see.
The day's movement trail for any employee, plotted point by point in order, with one-click handoff to Google Maps for directions.
Attendance percentages, hours logged, session counts and average duration — plus gap analysis that surfaces unexplained breaks between sessions.
Pick any set of times in a day and see, per employee, who was clocked in at each one. Filterable by branch, designation and reporting manager. Exportable to PDF.
The full reporting hierarchy as a navigable graph.
A month of attendance at a glance, and a session-by-session location trail for any single day.
Employees, branches, designations and hierarchy — including bulk onboarding by CSV upload with per-row validation and reporting.
CSV and PDF, because your finance team lives in a spreadsheet.
Currently English, Hindi and Urdu.
TraceOn can delegate authentication to a customer's existing HR or identity system on a per-company basis. Your employees keep one password, and you keep your existing user lifecycle.
A secured integration endpoint lets your HRMS push employee records into TraceOn — creating and updating people automatically as they join, move or leave. No double data entry.
Bulk CSV onboarding validates every row and reports exactly what succeeded and what didn't, so a failed import doesn't leave you guessing.
Notifications where they're needed. Push and templated email for onboarding, approvals, and attendance events.
TraceOn is a product, but the reason it works is engineering: an offline-first capture pipeline, a battery-aware tracking strategy, tamper-aware data, and a permission model that mirrors your organisation.