A fair and transparent voting system using the Condorcet method - no registration required, just rank and vote!
Online public version here : (vote-condorcet.com)
- Fair Voting - Condorcet method finds the candidate who beats all others in head-to-head matchups
- Ranked Choice - Voters rank candidates by preference (1st, 2nd, 3rd, etc.)
- Automatic Results - System calculates winner using pairwise comparisons
- Easy Sharing - Unique URLs and QR codes for poll distribution
- Duplicate Prevention - Cookie-based fingerprinting prevents vote manipulation
- No Account Required - Simple, accessible, anonymous voting
- Multi-language - Support for French (FR), Spanish (ES), and English (EN)
- Python 3.9+
- Git
# Clone repository
git clone https://github.com/yourname/condorcet-vote.git
cd condorcet-vote
# Create virtual environment
python -m venv .venv
source ./venv/bin/activate # On Windows: .venv\Scripts\Activate.ps1
# Install dependencies
pip install -r requirements.txt
# Setup database
python manage.py migrate
# Create admin user (optional)
python manage.py createsuperuser
# Run server
python manage.py runserverVisit: http://localhost:8000/
- Create Poll - Enter title, candidates, optional description
- Share Link - Get unique URL to share with voters
- Vote - Voters rank all candidates by preference
- Results - System calculates Condorcet winner automatically
- Compares each candidate against every other candidate head-to-head
- Winner is candidate who beats all others in one-on-one matchups
- If tie exists, Schulze tiebreaker method is used
Example:
Voters rank: Python > JavaScript > Java
JavaScript > Java > Python
Java > Python > JavaScript
Matchups:
- Python vs JavaScript: 2 wins β Python wins
- Python vs Java: 2 wins β Python wins
- JavaScript vs Java: 1 win, 1 loss β Tie
Result: Python is Condorcet winner (beats all others)
condorcet-vote/
βββ voting/ # Main app
β βββ models.py # Database models
β βββ views.py # Business logic
β βββ forms.py # Form validation
β βββ utils.py # Voting algorithm
β βββ templates/ # HTML templates
β βββ static/ # CSS/JavaScript
βββ condorcet_project/ # Django settings
βββ locale/ # Translation files (FR, ES)
βββ manage.py # Django CLI
βββ requirements.txt # Dependencies
βββ README.md # This file
python manage.py runserver
# DEBUG=True, SQLite database, no security restrictions-
Set environment variables (or
.envfile):SECRET_KEY- Django secret (generate new one)DEBUG- Set toFalseALLOWED_HOSTS- Your domain(s)
-
Run migrations:
python manage.py migrate
python manage.py collectstatic --noinput- Use Gunicorn:
gunicorn condorcet_project.wsgi:application --bind 0.0.0.0:8000# Run all tests
python manage.py test
# Run specific app
python manage.py test votingCurrently supported:
- π¬π§ English (EN) - Default
- π«π· FranΓ§ais (FR) - Complete
- πͺπΈ EspaΓ±ol (ES) - Complete
python manage.py makemessages -l [lang_code]
# Edit locale/[lang_code]/LC_MESSAGES/django.po
python manage.py compilemessagesSee requirements.txt for complete list. Main packages:
- Django 4.2.7 - Web framework
- Bootstrap 5 - Frontend styling
- PostgreSQL - Production database (optional, defaults to SQLite)
- Gunicorn - Production server
CC BY-NC-SA 4.0