Private decision infrastructure for organizations
Separates voter identity from ballots at every layer β cryptographically, not by policy.
Documentation β’ Getting Started β’ GitHub Issues β’ Discord
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
AnonVote Core (Turborepo Monorepo)
β
ββ apps/
β βββ frontend/ ββββββββββββββββββββββββ
β β (React + Vite) βββββββ€ http://localhost:5173
β β ββββββββββββββββββββββββ
β β
β βββ backend/ ββββββββββββββββββββββββ
β (Express + Node)βββββββ€ http://localhost:3001
β ββββββββββββββββββββββββ
β
ββ packages/
β βββ crypto/ @anonvote/crypto
β β ββ TypeScript crypto primitives & utilities
β β
β βββ contracts/ Soroban + Service Layer
β βββ anonvote/ Rust WASM contracts
β βββ service/ TypeScript integration
β
ββ docs/ Whitepaper, specs, guides
β
ββ turbo.json + pnpm-workspace.yaml
ββ Orchestrates builds, tests, dev servers
βββββββββββββββββββββββββββββββββββββββ
β Stellar Blockchain (Testnet/Mainnet)
β β’ Audit trail (manageData ops)
β β’ Soroban smart contract calls
β β’ Independent verification
βββββββββββββββββββββββββββββββββββββββ
β²
β
ββββββββββββββββ΄βββββββββββββββ
βΌ βΌ
PostgreSQL Stellar SDK
(Ballots, votes, (Contract
tokens, results) interaction)
# Clone the monorepo
git clone https://github.com/AnonVote/core.git
cd core
# Install all dependencies (pnpm workspaces)
pnpm install
# Build all packages
pnpm run build
# Run development servers (all apps in parallel via Turbo)
pnpm run dev
# Visit http://localhost:5173 (frontend)
# API running at http://localhost:3001- Node.js 20+
- pnpm 9+
- PostgreSQL 14+
- (Optional) Rust + Soroban CLI for smart contract development
π See core/README.md for full setup instructions
We maintain a single unified Turborepo monorepo:
| Component | Location | Tech |
|---|---|---|
| Backend API | apps/backend/ |
Express, Node.js, TypeScript, Prisma |
| Frontend | apps/frontend/ |
React 18, Vite, TailwindCSS, TypeScript |
| Cryptographic Library | packages/crypto/ |
TypeScript, Node.js/Web crypto |
| Smart Contracts | packages/contracts/ |
Rust (Soroban), TypeScript service layer |
| Documentation | docs/ |
Whitepaper, specs, API reference, diagrams |
All code lives in one repository: github.com/AnonVote/core
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 20+
- TypeScript
- Prisma ORM, PostgreSQL
- JWT authentication
- stellar-sdk v12
- TypeScript, Node.js/Web crypto
- AES-256-GCM encryption
- SHA-256 hashing
- CSPRNG token generation
- Rust, Soroban SDK
- WebAssembly (wasm32-unknown-unknown)
- Stellar blockchain integration
- TypeScript service layer for contract calls
- Turborepo β Task orchestration with caching
- pnpm β Monorepo package manager
- Vite β Lightning-fast frontend build
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/cryptolibrary enhancements - Documentation β Guides, tutorials, specs
- Testing β Unit tests, integration tests, property-based tests
- Security β Audits, vulnerability reports
See CONTRIBUTING.md for detailed 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)
- Setup & Deployment β Full setup guide, API reference, Turborepo info
- Cryptographic Library β @anonvote/crypto documentation
- Smart Contracts β Soroban contract guide
- Whitepaper β Formal privacy specification
- Contributing β Development guidelines
| 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.