baalot

Security

The path of one ballot.

From the moment you confirm your choice to the moment anyone can check the record, a ballot goes through six steps. Each one is described here with the limit that comes with it.

Six steps, in order

Each tag names the row in our claims register the sentence rests on. The limit under each step is part of the claim, not a footnote to it.

  1. SealedC1C2

    Your choice is encrypted with AES-256-GCM before it is stored, under a key held outside the database. If the system cannot encrypt a ballot, it refuses the ballot rather than storing it in the clear.

    LimitBaalot holds the key, because it computes the tally. A refused ballot is not queued: you see an error and cast it again.

  2. ChainedC3C4

    Every accepted ballot adds one entry to the election's audit chain, in the same database transaction as the ballot. Each entry commits to the one before it with SHA-256, so altering a past entry breaks every entry after it.

    LimitTamper-evident, not tamper-proof. Someone holding Baalot's server key could rewrite the chain and recompute every hash after it.

  3. ReceiptC6

    Each ballot produces a receipt that only your device holds. Check my vote uses it to confirm your ballot is in the record, and the check never shows anyone who you voted for.

    LimitIt proves your ballot was recorded as cast, not that the tally counted it. Lose the device and the receipt goes with it; Baalot cannot reissue it.

  4. TimestampedC15

    While an election is open, and for a day after it closes, Baalot timestamps the chain's root and entry count through OpenTimestamps whenever they change. Within a few hours each one is committed to a Bitcoin block and cannot be back-dated. Anyone can check the proof with the free OpenTimestamps client.

    LimitBaalot's server makes the checkpoints and they are periodic, so a change before the first one or between two is not exposed. Only a SHA-256 digest of one line of text goes to Bitcoin.

  5. Root emailedC16

    When an election closes, the institution's administrators are emailed the final chain root, the number of entries and a timestamp proof of both. Baalot cannot edit that email afterwards.

    LimitIt is a check only if the institution keeps the email, and the root it records is Baalot's.

  6. Anyone can replayC5

    The verification endpoint is public and needs no account. Anyone can ask it to replay an election's chain and report whether it is intact.

    Limit5,000 replays a day across everyone. Above about 20,000 entries one call checks the shard heads only, and the response says so.

Check an election yourself

The verification endpoint is public and needs no account. Ask it to replay an election's chain and it reports whether every entry still links to the one before it.C5

The response says whether it replayed every entry or, for a very large election, the shard heads only. A replay checks Baalot's data against itself, so keep the close email and its timestamp proof as the copy Baalot cannot change.C16

Replay one election

GET https://api.baalot.site/api/bbc-chain?action=verify&electionId=<id>

Replace <id> with the election's id. Without one the endpoint answers 400, Missing electionId.

What this does not protect against

We would rather you read these here than find them during an election.

  • It does not hide your choice from Baalot. Baalot holds the ballot key, because it computes the tally.C1

  • Ballots cast before 9 August 2026 were stored before sealing existed and are not encrypted.C1

  • The replay checks Baalot's data against itself. What a rewrite cannot get past is a timestamp proof or the close email kept outside Baalot.C4

  • One ballot per member is only as good as the institution's roster. Where a membership has no matric number recorded, one person holding two accounts can vote twice.C7

  • When results are published, the ballot count is recorded next to the chain's entry count. A mismatch is shown; it does not stop the result.C8

  • NIN or BVN verification is optional and Pro-only. It is not a condition of voting; eligibility comes from the institution's roster.C10

  • Fingerprint and face unlock happen on your device. The server never receives a biometric and cannot tell whether one was used.C11

  • Traffic between the app and Baalot is encrypted with TLS. That is ordinary, and we do not count it as a feature.C9

See where this fits in an election

The six steps above happen inside one stage of an election. The platform walkthrough shows the rest, from bringing in the roster to publishing provisional results.

Early access

Hear first when baalot lands on the Play Store.

Leave your email and we will tell you the day the Android app goes live, then send product notes as new features ship.

Launch news and product updates only. Reply to any email to unsubscribe. See our privacy policy.

Early access

We will email you the day the Android app is on the Play Store, then send product notes as new features ship.