vccs
Composable charting components for Vue 3, ported from Recharts
Opus Populi is a federated civic transparency project that maps the relationships between representatives, their donors, and their votes — built on public-domain civic data and open source under AGPL-
DataTypeScript · ShellGitHub @OpusPopuliOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Civic tools for the common good
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A civic platform that reads primary sources — ballot measures, meeting minutes,
representative records, campaign finance — and explains them in plain language,
with every assertion traceable to the passage it came from.
The AI is entirely open-source and self-hosted. So is the accountability: what
the platform cannot show evidence for, it says so about.
See Getting Started Guide for detailed setup instructions.
Evidence, and what we can currently showRead the full README ↗A civic platform that reads primary sources — ballot measures, meeting minutes, representative records, campaign finance — and explains them in plain language, with every assertion traceable to the passage it came from.
The AI is entirely open-source and self-hosted. So is the accountability: what the platform cannot show evidence for, it says so about.
# Clone and install
git clone https://github.com/rodneygagnon/opuspopuli.git
cd opuspopuli
pnpm install
# Start infrastructure
docker-compose up -d
# Pull LLM model
./scripts/setup-ollama.sh
# Start application (from project root)
pnpm dev
See Getting Started Guide for detailed setup instructions.
Every AI-generated claim is a row, joined to the citation it rests on, and
every citation has been checked — the verdict is the only way a piece of
evidence acquires a state, so an unchecked assertion cannot be laundered into
a table called evidence.
That makes one question answerable that used to be impossible: show every
published assertion that lacks primary evidence. It is a query, and a watched
metric (claims_unevidenced), not a claim in a README.
Measured against the current corpus — 1,497 claims:
| Family | verified | lacking verified evidence | |
|---|---|---|---|
| Ballot measures | 59 | 469 of 528 | 88.8% |
| Meeting minutes | 105 | 113 of 218 | 51.8% |
| Representative bios | 0 | 751 of 751 | 100% |
89% of what the platform asserts cannot currently be traced to a supporting passage. That number is published here for the same reason it is on a dashboard: a platform that measures its own evidence and then omits the result is choosing which of the two to believe.
Two things it does not mean. Representative bios are 100% by construction,
not by failure — they cite structured fields rather than text spans, so
nothing in that family can reach verified against a passage, and the
distinction between "no citation was offered" and "a citation failed a
check" is kept rather than collapsed. And the ballot-measure figure is the
honest result of a contract being replaced: citations used to be character
offsets the model asserted, which measured 2–11% accurate because counting
characters is arithmetic and no model tested does it. They are now verbatim
quotes the model supplies and code locates — exact, and failing closed when a
quote cannot be found.
Inference is self-hosted on Ollama and splits by job:
olmo-3.1:32b-instruct for analysis and synthesis, where the task is copying a
passage exactly and declining when the source does not support a claim, and
olmo-3:7b-instruct for ingestion, where it is structured extraction across far
more documents. Both are open-weight, and OLMo publishes its training data as
well as its weights.
All documentation is located in the docs/ directory:
| Component | Default Provider | Alternative Options |
|---|---|---|
| Embeddings | Xenova (in-process) | Ollama |
| Vector DB | pgvector (PostgreSQL) | Custom implementations |
| Relational DB | PostgreSQL (via Supabase) | Any PostgreSQL |
| LLM | Ollama (Qwen 3.5) | Any Ollama model |
Each Opus Populi region is operated independently. Production deployment lives in OpusPopuli/opuspopuli-node — a GitHub Template repo containing the per-region deployment kit (Terraform for Cloudflare, docker-compose-prod.yml, Mac Studio bootstrap, backup pipeline, observability configs). Each region operator uses the template to create their own repo (e.g. OpusPopuli/opuspopuli-node-ca), configures their Cloudflare account and Mac Studio, and runs the bootstrap.
This monorepo is the source of record: code, builds, signed images at ghcr.io/opuspopuli/*, and npm packages at npm.pkg.github.com/opuspopuli. No operator secrets ever live here. See docs/guides/deployment.md for the platform/operator split.
opuspopuli/
├── packages/ # 📦 Reusable platform packages (@opuspopuli/*)
│ ├── common/ # Shared types and interfaces
│ ├── llm-provider/ # LLM integration (Ollama)
│ ├── embeddings-provider/ # Embeddings (Xenova, Ollama)
│ ├── vectordb-provider/ # Vector DB (pgvector)
│ ├── relationaldb-provider/# Relational DB (PostgreSQL)
│ ├── extraction-provider/ # Text extraction
│ ├── storage-provider/ # File storage (Supabase Storage, Cloudflare R2)
│ ├── auth-provider/ # Authentication (Supabase Auth)
│ ├── secrets-provider/ # Secrets management (Supabase Vault)
│ ├── email-provider/ # Transactional email (Resend)
│ ├── logging-provider/ # Audit logging
│ ├── ocr-provider/ # OCR functionality
│ ├── scraping-pipeline/ # AI-powered web scraping (schema-on-read)
│ ├── region-provider/ # Civic data integration (declarative plugins)
│ └── prompt-client/ # AI prompt template client (circuit breaker, HMAC)
├── apps/
│ ├── backend/ # NestJS microservices
│ │ └── src/
│ │ ├── api/ # GraphQL Gateway (port 3000)
│ │ └── apps/ # Services (Users, Documents, Knowledge, Region)
│ └── frontend/ # React + Next.js application (port 3200)
├── docs/ # 📚 All documentation
│ ├── architecture/ # As-built architecture documentation
│ └── guides/ # How-to guides
├── infra/ # Terraform Cloudflare infrastructure
├── scripts/ # Utility scripts
└── docker-compose.yml # Local development services
The packages/ directory contains reusable workspace packages that provide pluggable provider implementations:
| Package | Purpose | Tests |
|---|---|---|
@opuspopuli/common | Shared types, interfaces, and HTTP connection pooling | - |
@opuspopuli/llm-provider | Ollama LLM integration | 16 |
@opuspopuli/embeddings-provider | Xenova/Ollama embeddings | 24 |
@opuspopuli/vectordb-provider | pgvector (PostgreSQL) | 15 |
@opuspopuli/relationaldb-provider | PostgreSQL | 7 |
@opuspopuli/extraction-provider | Text extraction (URLs, PDFs) with caching & rate limiting | 116 |
@opuspopuli/storage-provider | Supabase Storage, Cloudflare R2 | 41 |
@opuspopuli/auth-provider | Supabase Auth (Passkeys, Magic Links, Password) | 29 |
@opuspopuli/secrets-provider | Supabase Vault | 10 |
@opuspopuli/email-provider | Resend transactional email | - |
@opuspopuli/logging-provider | Audit logging | - |
@opuspopuli/ocr-provider | OCR functionality | - |
@opuspopuli/scraping-pipeline | AI-powered schema-on-read web scraping with structural manifests | - |
@opuspopuli/region-provider | Civic data integration (declarative plugins, propositions, meetings, representatives) | - |
@opuspopuli/regions | Declarative region config files (separate repo) | - |
@opuspopuli/prompt-client | AI prompt template client with circuit breaker, HMAC auth, and caching | - |
pnpm dev # Start all services in parallel (backend + frontend)
cd apps/backend
pnpm start # All microservices concurrently (with watch mode)
pnpm start:api # API Gateway only (port 3000)
pnpm start:users # Users service only (port 3001)
pnpm start:documents # Documents service only (port 3002)
pnpm start:knowledge # Knowledge service only (port 3003)
pnpm start:region # Region service only (port 3004)
pnpm build # Production build
pnpm test # Run tests
cd apps/frontend
pnpm dev # Dev server on port 3200
pnpm build # Production build
pnpm test # Run tests
docker-compose up -d # Start all services
docker-compose down # Stop all services
docker-compose logs -f # View logs
GNU Affero General Public License v3.0 (AGPL-3.0) - See LICENSE file for details.
For commercial licensing options, see LICENSE-COMMERCIAL.md.
Opus Populi is the foundation for the Opus Populi Network - a collaborative ecosystem of civic technology deployments serving different jurisdictions.