Private by design
The option you pick is never a readable field in a transaction or a database. Receipts are hashes, so they can't show how you voted.
Open source · Not for profit · Self-hostable
ZK Voting lets any group run its own elections and polls. Zero-knowledge proofs show that only eligible people voted, each one once, and that the published tally matches the ballots. Nobody's choice is ever published.
The big picture
Anyone can run a civic L2 for their own elections. Each one batches votes and settles them to Ethereum L1, so the record outlives any single operator.
hash(L2 ID, election UUID).Most elections still ask voters, candidates and courts to trust a few operators: who is on the roll, who was turned away, whether a ballot was counted, whether the result matches. ZK Voting turns those claims into things anyone can check.
The option you pick is never a readable field in a transaction or a database. Receipts are hashes, so they can't show how you voted.
Registrations, disqualification codes, vote proofs and the final tally are public. An independent auditor can rebuild the result without the operator's private database.
Every ballot carries a proof that the voter is on the frozen roll and not disqualified. A one-time nullifier rejects any second ballot.
Voters can change their mind privately before submitting, and nothing they are given proves their choice to someone pressuring them. Turnout is published hourly, after the hour closes, so a person can't be matched to a live tick.
Barring someone is a public, coded, on-chain change with a stated reason, not a silent database flag.
AGPL-licensed, run at cost, built to be forked and rebranded. Your group owns the node, the roll and the record.
Any body that needs a roll, a ballot and a result people will accept.
Run civic elections and referendums with nested districts, measures and articles, and a public results page observers can follow.
Hold leadership elections and contract ratification votes where members trust the count without trusting the officers.
Take board votes and member polls, including weighted and ranked-choice ballots, with an auditable outcome report.
Run student government and faculty votes with passkey sign-in and a ballot that's accessible on any device.
Quick yes/no, single-choice or multiple-choice polls for any group that wants a private, honest show of hands.
Follow registrations, disqualifications and the tally on the public explorer, and verify an outcome report offline.
Zero-knowledge proofs let the system check facts about a voter without putting the ballot in the clear.
Members sign up with a passkey, wallet, email or ID. The roll stores an identity commitment, never an address or document number.
Officials commit the eligible set and any disqualifications for the election.
Each ballot proves eligibility and spends a one-time nullifier, so a second ballot is rejected.
Vote proofs are published once an hour, after the hour closes.
When voting closes, anyone can check that the totals match the accepted ballots.
Your group runs its own node with Docker Compose, Coolify, Dokploy or CapRover, optionally kept private behind a Tailscale sidecar. Every node serves its self-hosting guides at /docs.
Day-to-day activity lands on the ZK Voting L2, a purpose-built civic sequencer and prover that settles to Ethereum. Final tallies can be mirrored on Ethereum mainnet.
# run your own node
cp .env.example .env
docker compose up -d --build
curl -fsS http://127.0.0.1:3000/health
ZK Voting is under active development. Tests use a mock verifier, the first proving path is in progress and the trusted-setup ceremony hasn't happened yet. Don't use it for a binding election today.
Passing a vote never auto-executes anything. Outcomes are verifiable; acting on them stays with the people.
community.zk-voting.org
The community forum is where people discuss real use cases, ask questions about running a node, and shape what gets built next.