Skip to content

Architecture

A high-level view of Civicore's architecture, including the region model and lifecycle.

Civicore is a modular monolith with a small set of well-defined modules:

  • Auth — Clerk-issued JWTs, verified server-side
  • Users & RBAC — scoped role memberships
  • Regions — IEBC-aligned hierarchy (county → constituency → ward)
  • Aspirants — profiles, manifestos, media, verification
  • Parties — party admin, roster, broadcasts
  • Campaigns — lifecycle phases, tasks, events, team roles
  • Volunteers — registration, assignments, activity logging
  • Communications — geo-targeted announcements + internal DMs
  • Analytics — cached aggregates, nightly rollups
  • Notifications — Resend email worker + push-ready record storage
  • Posts — Instagram-style stories, posts, live countdowns

The frontend (the SaaS app) runs on Next.js. The backend is NestJS with PostgreSQL, Prisma, and Redis. This documentation describes the product — the marketing site you are reading lives at the civicore.co.ke domain; the application is at app.civicore.co.ke.

Region model

Kenya's electoral hierarchy is modelled natively:

  • 47 counties
  • 290 constituencies
  • 1,448 wards

Every entity in the platform — aspirants, campaigns, events, broadcasts — is anchored to a region scope. This means a ward-level coordinator sees ward-level data, and a national party admin sees the country.