Ballotage – secret black/white-ball ballots


Features

Kind of a niche… But: Many clubs, societies and lodges admit new members by a secret ballot with black and white balls. This plugin brings that procedure to Discourse:

  • A voting page at /ballotage where members of a configured group cast one final vote – black or white – during a set period (default 00:01 on the start day to 23:59 on the end day, custom times optional).
  • A management page at /ballotage/manage for an oversight group and admins: who has voted while the ballot runs, the black/white result once it has ended.
  • Ballots can be cancelled, then finalized (result and participant list are irreversibly deleted) and finally removed from the list.
  • One ballot at a time, optional notice text on the voting page, English and German included.

How votes stay secret

  • The database stores who voted (no choice, no timestamps) and two anonymous counters – nothing links a member to a choice. Counters are bumped without touching updated_at.
  • Counts are hidden until the ballot is over: showing live counts next to the participant list would let observers match a new name to the counter that just moved.
  • Finalizing deletes result and participant list for good.

Limit: someone with direct database access watching the counters during a ballot could still correlate votes. That is out of reach for a plugin and needs to be handled organisationally.

Configuration

Setting Description
ballotage_enabled Enable the plugin
ballotage_voting_group Group whose members may vote
ballotage_oversight_group Sees participation and results (admins always can)
ballotage_oversight_can_manage Let the oversight group create, cancel, finalize and delete ballots
ballotage_info_text Optional notice shown on the voting page
ballotage_timezone Time zone for start/end times (default Europe/Berlin)

Add a sidebar or menu link to /ballotage so members find the voting page.

Compatibility

Discourse 2026.7 and later. In production on a small forum since September 2026.

Feedback, bug reports and translations are welcome – here or on GitHub.

3 Likes