Moe Loubani
Back to projects
RidingDesk
Next.js 16React 19PrismaPostgreSQLAWS SESLeaflet

RidingDesk

Canadian Voter CRM & Campaign Platform

Mar 2026

A voter CRM and campaign-management platform for Canadian federal, provincial, and municipal elections — with Canadian data residency, CASL-compliant outreach, and riding-level electoral data.

Visit RidingDesk

Overview

RidingDesk is a campaign-management platform built specifically for Canadian politics. It handles everything a riding-level campaign actually needs — voter contact records, canvassing, lawn signs, volunteer coordination, fundraising, and bulk email — across federal, provincial, and municipal races, with proper electoral-district data baked in.

It’s hosted 100% in Canada on a CACloud Toronto server, with Cloudflare sitting in front for DNS, CDN, and DDoS.

Technical Challenges

Canadian political software has to clear a specific bar that most generic CRMs miss:

  • Data residency. Donor lists and voter records need to stay in Canada end-to-end.
  • CASL compliance. Bulk email can’t be a free-for-all — consent, unsubscribe, and audit trails are legal requirements.
  • Electoral accuracy. Boundaries, postal-code lookups, and riding names differ across federal, provincial, and 8+ municipal systems.
  • Operational resilience. Campaigns spike on nomination day and election day — the platform needs to hold up under bursty load with a small team running it.

Solution

  • Next.js 16 App Router + React 19 + Prisma 7 on PostgreSQL 16, deployed to a CACloud Toronto VM behind Nginx + PM2 with Cloudflare in front.
  • In-house bulk email via AWS SES (ca-central-1) with a CASL consent model (express, implied donor, implied volunteer, political exemption), per-recipient delivery tracking, HMAC-signed unsubscribe tokens, RFC 8058 List-Unsubscribe headers, and auto-pause on >5% bounce or >0.1% complaint rate.
  • Electoral-data pipeline ingesting federal, provincial, and municipal boundaries from shapefiles + GeoJSON into Postgres, with postal-code-to-riding lookup and province-aware ward disambiguation (no more Cambridge ON ↔ Cambridge NB collisions).
  • Turf management for canvassing — draw walk-list polygons on a Leaflet map against a riding boundary, or list street-number ranges, then assign to volunteers.
  • Trust tiers on every campaign (NEW / TRUSTED / RESTRICTED) with daily send caps and platform-admin approval for first or large (≥1000) sends.
  • RBAC (Campaign Manager, Communications Lead, Volunteer Coordinator, etc.) with client-side route gating plus server-side role checks.
  • Full EN/FR i18n via next-intl, onboarding tour via driver.js, and a Playwright E2E suite.

Key Features

  • Voter records, canvassing walk lists, turf maps
  • Lawn-sign tracking with geocoded Leaflet map (install/collect workflow)
  • Volunteer management with signed agreements
  • Fundraising dashboard with monthly trend charts and Stripe-backed donations
  • CASL-compliant bulk email with merge tags, recipient filters, test sends
  • Nomination endorsement tracker (e.g. Ontario’s 25-signature requirement)
  • Election-day live dashboard over Server-Sent Events
  • Canadian-hosted, Canadian-owned infrastructure end-to-end