Case study
How do you let someone track "their" report with zero identity?
Anonymity and status-tracking usually fight each other. Sajag had to do both — without ever asking who's asking.
The problem
The barrier to reporting isn't apathy. It's the fear of being found out.
People in small communities usually know who's involved in local drug activity. What stops most of them from saying anything isn't indifference — it's that reporting has historically required exposure: a name on a complaint, a number a hotline can call back, a form that gets filed somewhere with your details attached. Every one of those is a reason not to say anything at all.
The design brief, in effect, was: build a reporting tool where the honest answer to "can this be traced back to me" is no — not "we promise not to," but architecturally no, because there's nothing to trace.
The approach
If there's no account, "my reports" can't mean what it normally means.
Most apps solve "let a user see their own history" with a login. Sajag can't do that without reintroducing the exact exposure it's trying to eliminate. The answer was to keep report references entirely on-device — local_db_service.dart and report_repository.dart track what this specific phone has submitted, with no server-side concept of a "user" to attach it to. The My Reports screen isn't pulling "your" data from a backend; it's reading a local record of what this device sent, matched against status updates for those specific report IDs.
The panic gesture needed the opposite kind of care: it has to trigger reliably on a real shake and never on normal handling — a phone in someone's pocket, picked up off a table. ShakeService tracks accelerometer delta with a tuned threshold (18 m/s² of combined acceleration change) and a one-second cooldown between triggers, calibrated so the gesture reads as deliberate, not accidental. Getting that threshold wrong in either direction breaks trust in the feature — too sensitive and it fires constantly and gets ignored; too strict and it doesn't fire when someone actually needs it.
The architecture
What's actually running under it.
- Platform
Flutter, targeting Android and iOS from one codebase, with Hindi and English localization built in from the start.- Identity
- No accounts, no login. Report ownership exists only as a local, on-device record — there's no server-side "user" to compromise.
- Offline handling
- A local queue (
local_db_service,sync_service) holds a report until connectivity returns, with an offline-status banner so the reporter knows it's queued, not lost. - Evidence
- Photo capture, voice-note recording, and location tagging, run through an evidence encryption service before it ever leaves the device.
- Safety gesture
- Accelerometer-based shake detection (
sensors_plus) with a tuned threshold and cooldown, wired to an app-wide lock controller that overrides whatever screen is currently showing.
The outcome
A quieter kind of software, built the same way as anything else.
No client commissioned this, no invoice is attached to it — it exists because the problem was real and local, and the same engineering discipline that goes into a paid SaaS build applies just as much here: offline handling, encryption, careful UX under stress, and a gesture calibrated through actual testing rather than a guessed constant.
I'm deliberately not publishing usage numbers or claiming measured impact here — that's not a metric I have honest data for, and this kind of project shouldn't need inflated claims to justify existing.
Working on something in the public-safety or social-good space that needs this level of care?
Get in touch