How anonymity actually works

Prove eligibility. Never reveal how anyone voted.

The app must prove that a person is allowed to vote, but it must not reveal how that person voted. That's the hardest and most important part of the entire system. Here's how it works.

The campaign lifecycle

One screen, six steps, no guessing what's next.

True Anonymity isn't a form you submit — it's a wizard you advance through. Every page in the operator console shows the same six-step progress bar, with the current step pulsing and completed steps marked done. Here's what each step actually does.

  1. 1

    Information setup — Operator

    The operator fills a short form: campaign title, briefing text (with full Markdown support — headings, lists, images, links), eligible-voter count, and two deadlines (one for the briefing window, one for voting). The system generates two separate one-time codes per voter — a briefing code and a voting code.

    Output: a campaign in information phase, briefing codes ready to distribute.

  2. 2

    Voter engagement — Voters

    Voters receive their briefing code. They click the link, read the briefing (rendered as proper formatted content — not a wall of text), and tap "I've read this" or "Skip". Both choices are anonymous; the system records the action without ever connecting it to identity.

    Output: per-voter briefing acknowledgement, captured as anonymous data.

  3. 3

    Review engagement — Operator

    While the briefing window is open, the operator watches a live dashboard: acknowledged, skipped, never seen, and overall engagement percentage. They decide whether voters are informed enough to vote — or whether the briefing needs more time.

    Output: a real decision, made before the ballot exists, informed by real engagement data.

  4. 4

    Build the ballot — Operator

    Now — and only now — the operator writes the questions. Four question types (Yes/No, multiple choice, ranking, rating). Each question can be abstained on with a structured reason from the "I choose not to vote" list. Clicking "Publish ballot" flips the campaign to the voting phase.

    Output: a published ballot. Voting codes start working.

  5. 5

    Voting — Voters

    Voters use their separate voting code at their assigned link. They answer the questions or abstain with a reason. Submitting locks the vote. The system stamps each anonymous ballot with the voter's earlier briefing decision — but discards every link back to the voter themselves.

    Output: an anonymous ballot pool, with each ballot tagged with its briefing-phase action.

  6. 6

    Analysis — Operator

    When voting closes, results unlock. Standard totals and percentages, plus the information audit: how many voters read the briefing, how many skipped, how many never visited — cross-tabulated with the "I wasn't informed enough" abstain reason. You learn whether your communication failed or whether voters chose not to engage.

    Output: PDF + XLSX + JSON exports. The kind of data administrators actually quote in board meetings.

Try the wizard in a live trial →
Data we don't store

What the app does NOT collect

Saying "it is anonymous" is not enough when the whole reason for this app is that people don't trust existing systems. Start with what we refuse to touch.

Data point Stored with the vote?
Voter nameNo
Student ID numberNo
Email addressNo
IP addressNo
Device informationNo
Timestamp linked to identityNo
The four guarantees

What the app promises

🙈

Admins cannot see who voted

The eligible voter list is separate from the vote pool. Admins know the list exists. They never see it joined to a ballot.

📋

Poll creators cannot see individual answers

Only aggregated results. Never line-by-line responses tied to a voter.

🔗

No one can link a vote back to a person

Not even with full database access. The connection doesn't exist in any record.

☝️

One vote per eligible voter — provably

The system can prove each person voted only once without revealing who they are. That's the whole trick.

The anonymity guarantee

How the code and the vote stay apart

Five steps. The link between the two is broken on purpose, before the vote is ever saved.

📤

1. Eligible list uploaded

The school uploads a list of eligible voters for the poll.

🎟️

2. Code issued

Each voter receives a unique one-time code (email, printout, or school system).

3. Code validated

The system checks: has this code been used? If not, the voter proceeds.

🗳️

4. Vote committed

After submission, the code is marked used and discarded. The vote goes into a pool with no link back.

🔒

5. Records sealed

The code and the vote never exist in the same record. Even the system administrator can't reconstruct who voted for what.

Planned — verifiable anonymity

"Was my vote counted?"

Trust is built by letting voters check for themselves, not by asking them to take our word.

Planned

After casting a ballot, voters receive a confirmation hash they can look up in the public tally. The hash confirms their vote was counted — without revealing what they voted. This is the strongest known trust pattern for anonymous voting, and it's on the roadmap.

See the roadmap for what's built, what's planned, and what's broken →

Preventing cheating

If voting is anonymous, can people cheat?

This is the obvious worry. The one-time code system solves it — mostly. Here's what's handled, and what isn't yet.

Edge case How we handle it Status
Someone tries to vote twice Each code is single-use. After submission the code is permanently locked. Built
Someone loses their code Code can be resent. The original is invalidated. If a vote was already cast with the old code, it's removed and a fresh code is issued. Planned
Someone wants to change their vote Votes are locked after submission. No changes allowed. This is intentional. Built
Someone shares their code with a friend This is the biggest unsolved challenge in the spec. Possible mitigations: short code expiration, school-network requirement, delivery through a school portal. Open problem

We're being honest about this: code sharing is the hardest open problem in the system. We don't pretend it's solved. The full discussion lives on the Roadmap & Known Gaps page.

When to use it

The use cases

🏛️

Elections

Student council, class president, club leadership. A few times per year.

📜

Policy decisions

Uniform changes, schedule changes, lunch rules. When a specific decision needs honest input.

💬

Sensitive feedback

School culture, bullying, teacher feedback. Monthly or quarterly check-ins.

👨‍👩‍👧

Parent input

Tuition, safety, scheduling. When the school needs honest parent opinion without the parent-teacher meeting awkwardness.

Polls can be scheduled in advance and set to close automatically. Results are only visible after closing — late voters can never be influenced by early results.

Now see the full feature list.

Four question types. Three visibility settings. Vote and feedback in one system. All explained on the features page.

Explore Features →