> For the complete documentation index, see [llms.txt](https://trustlevel.gitbook.io/knowledge-base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://trustlevel.gitbook.io/knowledge-base/tools-and-apps/zk-voting-app.md).

# ZK Voting App

Anonymous, verifiable voting on Cardano. Voters prove they belong to an authorised group and cast a ballot **without anyone — not even the organiser — being able to link the vote back to them**, while every vote is tallied immutably on-chain.

> **Status: Preview · Public test live** The application is deployed and open for public testing on the **Cardano Preprod Testnet**. No real funds are involved — voting uses free test ADA. This is a preview release; expect testnet-only behaviour and occasional changes.

**Try it:** <https://vote.trustlevel.io>

***

### What makes it different

* **Anonymous** — votes are cast with a zero-knowledge (Semaphore / Groth16) proof of group membership. The proof confirms you are an eligible voter without revealing *which* voter.
* **One vote per person** — a one-time cryptographic nullifier makes double voting impossible.
* **Closed group** — only invited participants can vote.
* **Publicly verifiable** — the final tally lives on the Cardano blockchain and cannot be altered.

Two voting modes: **Simple** (one vote for one option) and **Weighted** (distribute a fixed number of points across options).

***

### Before you start (one-time setup)

Because this is a testnet preview, you need a Cardano wallet set to **Preprod** and some free test ADA:

1. **Install a CIP-30 wallet** browser extension — [Eternl](https://eternl.io/), [Lace](https://www.lace.io/), or [Yoroi](https://yoroi-wallet.com/).
2. **Switch the wallet network to Preprod** (testnet), not Mainnet.
3. **Get free test ADA** from the [Cardano Testnet Faucet](https://docs.cardano.org/cardano-testnets/tools/faucet) — paste your wallet's Preprod address and request funds. A few test ADA is enough to cover transaction fees.

***

### For Organisers (Admins)

You set up and run a voting event end to end.

1. **Create the event** — connect your wallet at [vote.trustlevel.io](https://vote.trustlevel.io) and enter the event name, the options voters choose from, the voting mode (simple or weighted), and set the voting start/end dates (must be at least \~15 minutes in the future).
2. **Invite participants** — add people by wallet address or email. Each invitee gets a unique private link. The group is closed: only invited people can register and vote.
3. **Wait for registration** — invitees open their link and register. Their browser generates a private cryptographic identity locally; only a public commitment is added to the group. No personal data is collected.
4. **Deploy on-chain** — once the participant list is final, publish the event on the blockchain: Two transactions anchor the voting contracts on Cardano. From here, options, dates, and group membership are **immutable**.
5. **Read the results** — when voting closes, the tally is publicly readable on-chain. You see the totals only — never who voted for what.

***

### For Voters (Participants)

1. **Open your invitation link** in a browser that has a Preprod-configured Cardano wallet (see setup above).
2. **Register** — connect your wallet and confirm. Your browser creates a Semaphore identity: two secret values that **never leave your device**. Only a public commitment is sent to the group.
3. **Wait for the voting window** — the event has a fixed start and end enforced by the blockchain.
4. **Vote** — during the window, pick your choice and submit. Your browser silently generates a zero-knowledge proof of membership, computes a one-time anti-double-vote nullifier, and submits the transaction. No one can link the vote back to you.
5. **See results** — once the event ends, the tally is public and final on-chain.

***

### Links

|                                |                                                          |
| ------------------------------ | -------------------------------------------------------- |
| Live application               | <https://vote.trustlevel.io>                             |
| Source code (GitHub)           | <https://github.com/TrustLevel/ZK-Voting-App>            |
| Testnet faucet (free test ADA) | <https://docs.cardano.org/cardano-testnets/tools/faucet> |
| Semaphore protocol             | <https://semaphore.appliedzkp.org/>                      |

***

### FAQ

**Is this real money?** No. It runs on the Cardano **Preprod Testnet** with free test ADA.

**Can the organiser see how I voted?** No. The system is designed so that no party — organiser, server, or blockchain observer — can link a vote to a voter.

**Can I vote twice?** No. A one-time nullifier derived inside your zero-knowledge proof blocks any second vote, without ever revealing your identity.

**What if I lose my wallet/identity?** Your voting identity is derived from your wallet on your device. Keep access to the same wallet you registered with for the duration of the event.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://trustlevel.gitbook.io/knowledge-base/tools-and-apps/zk-voting-app.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
