Find your reps, send a real message, and organize neighbors around the issues that matter.
The challenge
Civic apps tend to dump raw government data on people or trap "contact your rep" behind a dead-end form. The Pinpoint App needed to carry a constituent from "who represents me?" all the way to a sent message and an organized group of neighbors — without burying them in screens.
How we built it
I rebuilt the app around four tabs — Reps, Pinboard, Posses, and You — plus a guided Outreach flow. Officials resolve from GPS or a typed ZIP through an OpenStates backend proxy; the Outreach composer relays a constituent message via Postmark with a DMARC-safe sender and the user as reply-to, enforcing daily caps, per-office cooldowns, and content screening, and falling back to copy/call/web-form when an office has no public email. The Pinboard and Posses run directly on Cloud Firestore, while a separate set of Firebase Cloud Functions owns the derived counters, consensus, and moderation.
What shipped
The Pinpoint App now reads like a tool, not a data dump: you find your representatives, send a real message with live delivery status, raise a local issue, and organize a moderated group around it. The print-inspired Editorial Ink design system — paper, ink, and oxblood in light; charcoal, off-white, and brass in dark — ties the whole experience together across iOS, Android, and web.
Outcomes
- Rebuilt the product around four focused tabs — Reps, Pinboard, Posses, and a guided Outreach flow — under a custom "Editorial Ink" design system.
- Shipped a Postmark-backed outreach relay with DMARC-safe sending, per-user caps, content screening, live delivery status, and copy/call/web-form fallbacks when an office takes no email.
- Built a Firestore-backed issue Pinboard and group "Posses" with community-consensus resolution and moderation, with counters and safety logic owned by Firebase Cloud Functions.