piech.dev

Back to Projects github.com/Tenemo/sealed-vote

sealed.vote

Netlify Status API status


Production E2E tests CI Tests coverage


Node version License


sealed.vote is a browser-based 1-10 score voting application built around threshold-elgamal. It uses a public roster, an append-only bulletin-board-style log, and local verification so that voters can audit who is participating while keeping ballot contents confidential.

(recorded with Playwright, I got bored of manually re-recording the demo video after UI changes quite quickly)

Overview

The frontend and backend both rely on threshold-elgamal, a TypeScript cryptography library used for the board ceremony, threshold encryption workflow, and local verification. Closed polls publish a frozen manifest with rosterHash, optionList, and the fixed score range { min: 1, max: 10 }, and every signed board payload is versioned with protocolVersion: 'v1'.

How it works

  1. A poll creator opens a score poll and shares its slug-based URL.
  2. Voters join the waiting room with public names and receive voter-specific tokens.
  3. Once at least three voters are registered, the creator starts voting and the roster becomes fixed.
  4. The client signs and appends protocol payloads to the board log behind guided UI actions. The board is append-only and every message is classified as accepted, idempotent, or equivocation.
  5. The public read model derives ceremony phase, digests, manifest state, and verification status only from the ordered board entries.
  6. After voting closes, the app completes the DKG, encrypted ballot publication, ballot-close, decryption-share, and tally-publication flow automatically in the browser, then verifies the final result from the public board log.

This repository currently targets a hardened research prototype, not audited production voting software.

See docs/voting.md for the board ceremony model, and docs/endpoints.md for the current API surface.

Tech stack

Offline and reconnect recovery

Offline and reconnect recovery is a core feature of the app, not a best-effort extra.

Local development

Requirements

Running the full stack

From the repository root:

pnpm install
pnpm local:reset
pnpm dev

pnpm local:reset recreates the Docker services, resets the database, and seeds local sample data in one step.

The default local setup serves:

Running tests locally

Workspace documentation

License

This repository is licensed under AGPL-3.0-only. See LICENSE for the full text.