A full-stack case management system for Do Moore Good's Pardon Me Campaign, Philadelphia. Purpose-built in Django to replace disconnected spreadsheets, now handling intake through Board of Pardons submission with a chained AI review pipeline and a threaded case-communication log.
As the Pardon Me Campaign grew, the team was tracking applicants, volunteers, and hubs across spreadsheets, with no central system and no way to coordinate communications. There was no document management, no automated outreach, and no single place for staff to see the full picture of a case.
A full-stack Django web application purpose-built for the Pardon Me Campaign. One codebase, one database, one place for staff and coaches to work.
Super admins, hub managers, and pardon coaches (community liaisons, peer volunteers) each see a scoped slice of the data, plus a future applicant portal. Every list query is scoped to the user's role. A coach's URL cannot expose another coach's applicants, even if guessed directly.
A five-step Gemini prompt chain: dedupe and timeline every uploaded document, summarize the court record, score it against the PA Board of Pardons criteria, evaluate rehabilitation factors, and flag charges eligible for expungement or Clean Slate Act relief without a pardon. Each step feeds the next. Prompts live in the database, editable by staff without a developer, and every output is reviewed before it touches a case.
Case notes and contact history live in one threaded log per applicant, not a separate spreadsheet tab. A coach replies directly under any entry to keep a back-and-forth linked instead of scattering it across new rows, and a soft-delete with recovery means an accidental delete never loses history.
A coach forwards their actual email exchange with an applicant to a dedicated address. A Gmail Apps Script and webhook parse it, match both participants against the database, and auto-create the update, attachments included, no retyping. Anything it can't confidently match lands in a staff review queue instead of silently failing.
A queue-based email system with named trigger classes (status change, hub assignment, coach pairing, plus automated follow-up and coach-inactivity reminders). Every message is logged, BCC'd to a sysadmin mailbox for audit, and per-recipient opt-out is respected at send time.
One-click copy of name and DOB for court lookups, plus a bookmarklet that auto-fills the PA Unified Judicial System search form and bulk-downloads every docket sheet on the results page. Cuts document collection from 20 minutes to under two.
Auth uses magic-link email. Users click a time-limited link to start a session. No passwords, no OAuth flow, no Google account required for coaches. A weekly job still mirrors core records to a legacy Google Sheet as a fallback, but the spreadsheet-driven workflow the original system depended on is long gone.
| Last name ▲ | First name | Status | DOB | Hub | Coach | Follow-up | Added | Updated | |
|---|---|---|---|---|---|---|---|---|---|
| View | Applicant A Addition | New | 1982-04-09 | Unassigned | Unassigned | - | 2026-05-01 | 2026-05-01 | |
| View | Applicant B | In Progress | 1978-11-22 | West Philly Hub | Coach 1 | 2026-04-30 | 2026-03-14 | 2026-05-08 | |
| View | Applicant C | Submitted | 1990-07-03 | Kensington Hub | Coach 2 | 2026-06-01 | 2026-02-28 | 2026-05-10 | |
| View | Applicant D | Approved | 1975-02-17 | North Philly Hub | Coach 3 | - | 2025-11-05 | 2026-04-22 | |
| View | Applicant E | In Progress | 1986-09-14 | Germantown Hub | Coach 4 | 2026-05-28 | 2026-01-19 | 2026-05-12 |
Grouped by year, then month; individual events are plain list items rather than nested accordions, so a long case history reads top-to-bottom without extra clicks. Citations link back to the exact source PDF and page.