Haitham AssoliRead this in Arabicاقرأ هذه الصفحة بالإنجليزية
Back to the sheet

Mobile2025

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.

Production
Sawt
Role
Solo: mobile and backend
Year
2025
Status
Shipped
Format
Mobile
Built with
React NativeTypeScriptOTP verificationFirebaseZustandReact QueryReanimatedRestyleZod
Where to find it
Sawt — Automating an election, from voting to results.صوت — أتمتة العملية الانتخابية، من التصويت إلى النتائج.

Treatment

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

  1. One person, one vote, on a device you do not control

    The problem

    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.

  2. Everyone votes in the last hour

    The problem

    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.منشور على Google Play.
  • Identity-verified, one-vote-per-voter enforcement on the server.هوية مُتحقَّق منها وفرض صوت واحد لكل ناخب على الخادم.

Stills

  • Sawt — still 1/6صوت، لقطة 1 من 6
  • Sawt — still 2/6صوت، لقطة 2 من 6
  • Sawt — still 3/6صوت، لقطة 3 من 6
  • Sawt — still 4/6صوت، لقطة 4 من 6
  • Sawt — still 5/6صوت، لقطة 5 من 6
  • Sawt — still 6/6صوت، لقطة 6 من 6
Next design — PlayroomSee all 14