Haitham AssoliRead this page in Arabicاقرأ هذه الصفحة بالإنجليزية
All projects

ShippedMobile2025

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: Automating an election, from voting to results.
Role
Solo: mobile and backend
Year
2025
Status
Shipped
Built with
  • React Native
  • TypeScript
  • OTP verification
  • Firebase
  • Zustand
  • React Query
  • Reanimated
  • Restyle
  • Zod
Where to find it

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

    The snag

    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.

    What I did

    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

    The snag

    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.

    What I did

    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 design — SignalSee all 14