| Summary | Secret black/white-ball ballots (“ballotage”) for a member group, with participation oversight. | |
| Repository Link | GitHub - DaniW42/discourse-ballotage: A Discourse plugin for secret black/white-ball ballots ("ballotage" — in German "Kugelung"), as used by clubs, societies and other membership organizations for admitting new members. A member either casts a black or a white ball; who voted is recorded, but what they voted is not. · GitHub | |
| Install Guide | How to install plugins in Discourse |
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
/ballotagewhere 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/managefor 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.

