$ cd ~/work && cat sawt.md
--- title: Sawt role: Solo: mobile and backend year: 2025 status: Shipped category: Mobile stack: [React Native, TypeScript, OTP verification, Firebase, Zustand, React Query, Reanimated, Restyle, Zod]
playGoogle: Google Play
github: Source ---
Sawt
Automating an election, from voting to results.
An app that digitises the election process end to end: voter registration, identity-verified access, casting a vote and announcing results. Built for transparency at every stage.

##Overview
Voting is the least forgiving thing to build. A bug in a normal app annoys someone; a bug here invalidates a result and the trust that goes with it.
Sawt covers the whole cycle: voters register and access their account through verified identity, cast a ballot, and results are announced through the same system. The engineering priority throughout was that every stage be verifiable rather than merely fast.
## Challenges
### One person, one vote, on a device you do not control
Anyone can install the app twice, on two phones, with two numbers. Device-based identity is not identity, and client-side checks are trivially bypassed.
Eligibility is bound to a verified identity checked server-side via OTP, and the ballot record itself enforces uniqueness per voter per election. The device is treated as untrusted throughout.
### Everyone votes in the last hour
Election traffic is not steady. It is nothing for days and then everything at once, right before closing. A system that works in testing can fold exactly when it matters.
Writes are kept small and idempotent so a retried submission cannot double-count, and reads for results are served from aggregates rather than recomputed per request.
##Results
- Published on Google Play.
- Identity-verified, one-vote-per-voter enforcement on the server.
## Screens





$ next
KheirDonate directly to people in need.