RidingDesk
Canadian-Hosted Voter CRM With CASL-Enforced Bulk Email
Mar 2026
Canadian-hosted campaign CRM that auto-pauses bulk email on bounce or complaint thresholds.
A voter CRM and campaign platform for Canadian federal, provincial, and municipal elections, with data residency in Canada, a CASL-aware email pipeline, and geospatial turf management over ingested electoral boundaries.
Visit RidingDeskOverview
RidingDesk is a campaign-management platform for Canadian politics: voter records, canvassing, lawn signs, volunteers, fundraising, and bulk email across federal, provincial, and municipal races. It is hosted entirely in Canada on a CACloud Toronto server, with Cloudflare in front for DNS, CDN, and DDoS.
My Role
I designed, built, shipped, and operate RidingDesk end to end: the data model, the electoral-data pipeline, the email system, the deployment, and the test suite.
Architecture
- Next.js 16 App Router, React 19, and Prisma 7 on PostgreSQL 16, deployed to a CACloud Toronto VM behind Nginx and PM2, with Cloudflare in front.
- An electoral-data pipeline ingesting federal, provincial, and municipal boundaries from shapefiles and GeoJSON (reprojected with proj4) into Postgres, plus a custom PDF extraction pipeline for municipal data. Postal-code-to-riding lookup is province-aware.
- Turf management: walk-list polygons drawn on a Leaflet map against a riding boundary, or street-number ranges, assigned to volunteers.
- In-house bulk email on AWS SES in ca-central-1.
- An election-day live dashboard over Server-Sent Events.
- Full EN/FR i18n via next-intl.
Key Engineering Decisions
- Own the email pipeline instead of using a generic sender. CASL makes consent, unsubscribe, and audit trails legal requirements, so the consent model (express, implied donor, implied volunteer, political exemption) and per-recipient delivery tracking live in the data model.
- Province-aware ward disambiguation. Municipal and federal naming collides across provinces (Cambridge ON versus Cambridge NB), so lookups resolve on province rather than name.
- Canadian hosting end to end. Donor lists and voter records have to stay in Canada, so the platform runs on a CACloud Toronto server with Cloudflare in front.
- Server-side role checks behind client-side route gating. RBAC (Campaign Manager, Communications Lead, Volunteer Coordinator, and others) is enforced on the server, so the UI gating is a convenience and not the control.
Reliability & Security
- Trust tiers on every campaign (NEW, TRUSTED, RESTRICTED) with daily send caps and platform-admin approval for first sends and sends of 1,000 or more.
- Automatic pause on a bounce rate above 5% or a complaint rate above 0.1%, protecting sender reputation.
- HMAC-signed unsubscribe tokens and RFC 8058 List-Unsubscribe headers.
- Playwright E2E coverage plus axe-core accessibility checks.