Structured deliberation, sortition, and verifiable voting for civic decision-making. Bilingual (Ελληνικά / English).
Instead of a comment section and a poll, a proposal moves through a defined lifecycle: community amendments, a randomly selected citizen jury, and a ratification vote whose count anyone can re-verify.
AgoraX runs as a single self-hosted instance and is built for consultative deliberation — verifiable, but not legally binding under Greek electoral law.
If you are considering hosting it, read docs/STATUS.md first: what is implemented, what the vote actually guarantees, what data you would be processing, and what the platform cannot do yet.
- Structured deliberation — every proposal follows the same lifecycle; transitions are validated, not ad hoc.
- Community amendments — members propose changes; the community can override an author's rejection.
- Sortition — a randomly selected jury (Athenian-style) reviews and revises.
- Verifiable voting — a per-proposal SHA-256 hash chain; any later edit is detectable by re-running the count.
- Anonymous mode — blind-signed tokens (RFC 9474) make a ballot cryptographically unlinkable to the voter. Opt-in per proposal.
- Identity — one vote per real person, via a Gov.gr solemn declaration.
- Deliberation rooms — real-time audio/video (LiveKit), feed, notifications.
Eight states, defined canonically in
shared/proposal-lifecycle.ts:
draft ─▶ review ─▶ author_review ─▶ community_signal ─▶ sortition_synthesis ─▶ voting ─▶ decided
└────▶ archived
Progression is forward-only and each transition is validated at the API layer;
archived is reachable from any active state. Quality review at the review
step runs on a self-hosted local LLM — proposal text never leaves the
instance. See docs/DELIBERATION.md.
Prerequisites: Node.js 20+, PostgreSQL 14+ (Python 3.11+ for identity verification).
git clone https://github.com/miltosdoc/agorax-platform.git
cd agorax-platform
npm install
createdb agorax
npm run db:push # create the schema
cp .env.example .env # set DATABASE_URL and SESSION_SECRET
npm run dev # http://localhost:3001npm run db:seed loads demo content.
Identity verification is a separate FastAPI service; the app runs without it, only Gov.gr verification is then unavailable. Full runbook, Docker Compose, and the three-process layout: docs/RUNNING.md.
A React client, an Express API organised into domain repositories, and a Python ballot service for Gov.gr PDF validation — all against one Postgres. The anonymous vote path uses a separate database role that is denied access to every identity table.
Details and the blind-signature flow: docs/ARCHITECTURE.md.
| Status & readiness | Start here if you might host it |
| Running | Install, services, Docker, local runbook |
| Architecture | Domain design, data flow |
| Deliberation | Lifecycle, amendments, sortition |
| API reference | Endpoints |
| Security posture | What is implemented, and the gaps |
| Verifiable voting | Backends, threat model |
docs/compliance/ |
DPIA, ROPA, vote-linkage and anonymity audits |
Conference rooms, push notifications, the Android wrapper, polling and the media
pipeline each have their own guide in docs/.
See the Contributing Guide. Before opening a pull request:
npx tsc --noEmit && npm test && npm run check:i18n && node scripts/check-modularity.cjsSecurity issues: please report privately — see SECURITY.md.
CC-BY-NC-4.0 — reuse with attribution; no commercial relicensing without permission.
Built in Sweden, inspired by Athens — digital democracy with engineering rigor.