The Democracy App was written as a bespoke tool to handle voting in AGMs for a student theatre society alongside a friend of mine, @saty9. We were using a combination of Yes/No/Abstain voting and the far more complex to calculate Scottish Single Transferrable Vote system.

Previously, ballots were handled on paper cards which had to be returned and loaded into OpenSTV manually before a result was calculated. This caused meetings to sometimes extend beyond 5 hours when there were several show slots to be voted on.

DemocrApp was designed with the following goals:

  • Accessible to all voters, with a platform-agnostic web-app and support for in-person voting at a kiosk if the voter didn’t have access to a compatible device.
  • As anonymous as possible - we used one-time, numeric voter tokens generated by the meeting secretary at sign in to authenticate with the platform. These were at no point linked to a voter’s identity
  • Low bandwidth to allow many devices to connect through the (rather flaky) WiFi in the theatre’s venue
  • Simple to use with obvious and clear options and feedback throughout the process
  • Real-time ballot opening and closing, to support the immediate nature of the in-person meetings. We used websockets to allow ballots to be pushed to devices and closed immediately when commands were issued by the secretary

This was achieved by a Django and Celery app server communicating with a single page front-end app written with Vue.js, and the application was in active use within the society for several years.

Although development has stalled, the app has been taken closed source while we were working on pivoting to offering the system as a SaaS multi-tenant application, with subscriptions and payments managed through Stripe. This new version was deployed on fully containerised infrastructure using DigitalOcean’s managed Kubernetes service with Helm and used continuous integration through Argo CD and GitHub Pipelines.

We have a “marketing” site which explains some of the features up at