Haitham Assoli · print spoolerFILE SAWT

ASSOLI — home[ Work ][ عربي ][ Hire me ]

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

Sawt
sawt-1.png

##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

Sawt — 1
Sawt — 2
Sawt — 3
Sawt — 4
Sawt — 5
FOLD

$ next

KheirDonate directly to people in need.