Private decision infrastructure for organizations
Separates voter identity from ballots at every layer — cryptographically, not by policy.
AnonVote is a privacy-preserving voting platform where:
- No voter is linked to their ballot – Cryptographically enforced, not by policy
- Results are blockchain-verified – Anchor to Stellar for independent verification
- No accounts required – Voters only need a link and their identifier
- Multiple voting schemes – Standard, weighted, ranked-choice, delegated voting
- Fully open source – MIT licensed, self-hostable
- Voter identifiers hashed before storage
- Tokens cryptographically unlinked from votes
- Votes encrypted with AES-256-GCM
- No voter PII on-chain
- Immutable audit trail on Stellar
- Smart contract verification via Soroban
- Independent result verification
- No need to trust AnonVote's servers
- Standard – One vote per token
- Weighted – Tokens with vote weight > 1
- Ranked-Choice – Preference ranking
- Delegated – Vote delegation chains
- TypeScript throughout
- REST API with clear contracts
- Shared crypto library (
@anonvote/crypto) - Extensively documented codebase
┌─────────────────────────────────────────┐
│ React Frontend (Vite) │
│ Ballot creation, voting, results view │
└─────────────────┬───────────────────────┘
│ REST API
▼
┌─────────────────────────────────────────┐
│ Express Backend (Node.js) │
│ • Ballot management │
│ • Token issuance │
│ • Vote encryption & tallying │
│ • Audit logging │
└─────────────────┬───────────────────────┘
│
┌───────┴────────┐
▼ ▼
┌──────────────┐ ┌────────────────┐
│ PostgreSQL │ │ Stellar Chain │
│ │ │ │
│ • Ballots │ │ • Audit Trail │
│ • Votes │ │ • Verification │
│ • Tokens │ │ • Governance │
│ • Results │ │ (Soroban) │
└──────────────┘ └────────────────┘
# Clone the main repository
git clone https://github.com/AnonVote/core.git
cd core
# Backend setup
cd backend
npm install
cp .env.example .env
npm run prisma:migrate
npm run dev
# Frontend setup (new terminal)
cd ../frontend
npm install
npm run dev
# Visit http://localhost:5173- Node.js 18+
- PostgreSQL 14+
- (Optional) Rust + Stellar CLI for smart contract work
📖 See core/README.md for full setup instructions
| Repo | Purpose | Tech |
|---|---|---|
| core | Main application (backend + frontend) | Express, React, Prisma, PostgreSQL |
| js | Cryptographic primitives & types | TypeScript, Node.js crypto |
| contracts | Soroban smart contracts | Rust, Stellar Soroban SDK |
| docs | Whitepaper & specifications | Markdown, diagrams |
Admin creates a ballot with options, deadline, and eligibility list
- Voter enters identifier (email, employee ID, etc.)
- System verifies eligibility
- One-time random token generated
- Token sent via email; original never stored in DB
- Voter uses token to submit vote choice
- Vote encrypted with AES-256-GCM
- Encrypted payload stored; vote content never visible
- Event recorded on Stellar
- Admin closes ballot at deadline
- System decrypts votes and counts them
- Result published to PostgreSQL + Stellar + Soroban
- Consistency verified: tokens_issued == votes_cast
Anyone can verify the result by checking the Stellar transaction ID or querying the Soroban contract
Voter Identifier → SHA-256 hash → stored only as hash
↓
Generate cryptographic token
↓
Token → SHA-256 hash → stored only as hash
(original token → given to voter, discarded)
↓
Vote Option → AES-256-GCM encrypt → stored encrypted
(decrypted only at tally)
Result: No link between voter identity, token, and ballot choice exists anywhere.
✅ JWT authentication for organizations
✅ Rate limiting on token requests
✅ Duplicate attempt tracking (audit events only)
✅ Vote consistency verification
✅ M-of-N governance for critical operations
✅ 48-hour timelock on smart contract upgrades
✅ Immutable audit trail on Stellar
- Corporate governance – Board elections, shareholder votes
- Academic institutions – Student government, faculty voting
- Nonprofits – Member voting, annual elections
- DAOs – Decentralized autonomous organizations
- Public polls – Surveys with privacy guarantees
- Team decisions – Agile retrospectives, sprint planning
- React 18, Vite, TypeScript
- Tailwind CSS, Radix UI
- Axios for HTTP
- Express.js 4.18, Node.js
- TypeScript
- Prisma ORM, PostgreSQL
- JWT authentication
- stellar-sdk v12
- Rust, Soroban SDK
- WebAssembly (wasm32-unknown-unknown)
- Stellar blockchain
- M-of-N governance
- SHA-256 (identifier/token hashing)
- AES-256-GCM (vote encryption)
- CSPRNG (token generation)
We'd love your help! Areas for contribution:
- Frontend – React components, UX/UI improvements
- Backend – API enhancements, performance optimization
- Smart Contracts – Rust/Soroban contract work
- Crypto –
@anonvote/cryptoenhancements - Documentation – Guides, tutorials, specs
- Testing – Unit tests, integration tests, property-based tests
- Security – Audits, vulnerability reports
See CONTRIBUTING.md for guidelines.
AnonVote is designed for transparency and auditability:
- Open source – All code publicly available
- No black boxes – Every component auditable
- Formal privacy model – Published whitepaper
- Blockchain verified – Independent verification possible
Please email security@anonvote.app (do not post publicly)
- Core Docs – Setup, API reference, deployment
- Crypto Docs – Cryptographic primitives
- Contract Docs – Smart contract guide
- Whitepaper – Formal specification
| Component | Status | Notes |
|---|---|---|
| Backend API | ✅ Production Ready | Fully tested, deployed |
| Frontend | ✅ Production Ready | Responsive, accessible |
| Stellar Integration | ✅ Active | manageData audit trail |
| Soroban Contract | ✅ Ready | Written, awaiting deployment |
| Testnet Deployment | ✅ Available | Public testnet instance |
| Mainnet Deployment | 🔄 In Progress | Pending security review |
Q: Do voters need an account?
A: No. Voters only need the ballot link and their identifier (email, employee ID, etc.).
Q: Is my vote really private?
A: Yes. Cryptographically. Your identifier → hashed. Token → hashed. Vote → encrypted. No joins exist.
Q: Can the admin see how I voted?
A: No. Votes are encrypted. Admins see only aggregate results.
Q: How do I verify the results?
A: Check the Stellar transaction ID on Stellar Expert. Query the Soroban contract. Independent verification is the whole point.
Q: Can I self-host AnonVote?
A: Yes! It's open source. See DEPLOYMENT.md.
Q: Is it free?
A: Yes, open source MIT licensed. Only costs are Stellar testnet (free) or mainnet (tiny XLM fees).
AnonVote uses the Stellar blockchain for:
- ⛓️ Immutable audit trails
- 🔐 Decentralized verification
- 💰 Low-cost transactions
- 🚀 High throughput
- 🌐 Global network
- Discord – Join our community
- Email – hello@anonvote.app
- Security – security@anonvote.app
- Issues – GitHub Issues
- Discussions – GitHub Discussions
AnonVote is MIT licensed – free to use, modify, and distribute.
Privacy is a right, not a policy.