Wahltool

Webapp for anonymous voting

History of development and basic functions

The Wahltool was developed within a few weeks to enable the digital, DSGVO-compliant election of board members in an association. Special attention was paid to making the election process particularly uncomplicated and interactive for the voter. The authorities of the election should be able to create authorized voters, as well as elections (“Wahlen”) in an admin dashboard and view their results. It is important that for each answer only the number of votes is visible – but not who voted for it. Nevertheless, a mechanism must exist to prevent the casting of multiple votes per person per election. The following (few) pieces of information are therefore collected per person:

  • Voter identifier (e.g. email address)
  • Status, whether the voter has already participated in the current election.

After an election, the results can be exported as a JSON document.

Election procedure

The voter enters his identifier (email address) that has been approved for voting:

Entering the voter identifier
Entering the voter identifier

Afterwards, either the election is displayed directly (see below) or – if no election is currently running – a waiting lobby is displayed:

Waiting lobby
Waiting lobby

As soon as an election is published and the voter has not yet voted, the answer options are displayed:

Election with answer options
Election with answer options

After voting, the voter will be redirected back to the waiting lobby to vote again in the next election without having to log in again.

Admin dashboard

On the admin dashboard, voters can be created or deleted, and polls can be created or stopped. When an election is stopped, a JSON document is also created, which can be used to parse the election results digitally.

{
    "question": "What is the meaning of life?",
    "choices": [
        "Yes",
        "No",
        "Maybe",
        "42"
    ],
    "users_voted": {
        "user1@<redacted>": true,
        "user2@<redacted>": true,
        "user5@<redacted>": true,
        "user8@<redacted>": true
    },
    "choices_count": {
        "Maybe": 1,
        "42": 3
    }
}

This document shows the distribution of votes in "choices_count" and which voters have voted. However, it is not visible who voted for which option.

After stopping an election, all records are deleted on the server side - there is no persistent database. The results are then only contained in the generated JSON document.

Future development

For upcoming elections, the manual creation of voter identifiers is to become optional. Microsoft OAuth should also be implemented for populating those identifiers.