Case Study

Pardon Hub: Django Rebuild

A full-stack case management system for Do Moore Good's Pardon Me Campaign, Philadelphia. Purpose-built in Django to replace disconnected spreadsheets with a single, integrated platform.

Django AI-Assisted Review Role-Based Access Google Drive Comms Pipeline

The Problem

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.

The Solution

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.

Role-Based Access

Four roles: super admin, hub manager, volunteer, and a future applicant portal. Every list query is scoped to the user's role. A volunteer's URL cannot expose another volunteer's applicants, even if guessed directly.

AI Case Review

Gemini 2.5 Flash via Vertex AI summarizes court documents, evaluates applicants against pardon criteria, and can pre-fill conviction history fields. Prompts are stored in the database and editable by staff without a developer. Every output is reviewed before any action is taken.

Communications Pipeline

A queue-based email system with named trigger classes (status change, hub assignment, coach pairing). Every message is logged, BCC'd to a sysadmin mailbox for audit, and per-recipient opt-out is respected at send time.

PA UJS Portal Integration

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.

System Architecture

Public Intake
Multi-step form
Django App
Core logic + auth
SQLite DB
Source of truth
Google Drive
Proxied doc storage
Vertex AI
Gemini 2.5 Flash
Email Queue
Comms + audit BCC
Google Sheets
Weekly fallback sync

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 volunteers.

Application Mockups

Applicants (staff view)
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 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
Applicant Detail

Applicant B

In Progress Submit an update Upload documents
APP-0412 · added 2026-03-14 · last updated 2026-05-08 10:31 · hub West Philly Hub
Personal info
Updates (3)
Documents (2)
Communications (4)
AI Summary (1)

Assignments

Hub: West Philly Hub
Coach: Coach 1
Add

Conviction history

CountiesPhiladelphia
OffensesPossession w/ intent
Sentence typeProbation
ViolationsNo
Yrs since completion10+ years
Copy for UJS search Open the portal
AI Summary Tab
Generate View current prompt ↗
Summarize court documents · 2026-05-08 10:22 · gemini-2.5-flash · 2 document(s) · latest

Conviction summary: One conviction on record (Philadelphia County, 2013). Possession with intent to deliver a controlled substance (35 P.S. 780-113(a)(30)). Docket CP-51-CR-0002847-2013.

Sentence: 2 years probation, completed without violation. No incarceration.

Years since completion: Sentence completed approximately 2015. Approx. 11 years elapsed.

Notes: No additional arrests or charges found in the record set provided. One alias on record (maiden name). Employment records referenced in RAP sheet indicate current employment. Strong candidate for positive board evaluation based on time elapsed and clean record post-conviction.

Fill Conviction History from this summary

Check the fields you want to replace with the AI's values, then apply. Review each one carefully.

Replace? Current value From this summary
Philadelphia Philadelphia
Possession w/ intent PWID (35 P.S. 780-113(a)(30))
Probation Probation
(blank) 10+ years
Apply checked fields

Impact

Tech Stack

Django Python SQLite Google Drive API Vertex AI / Gemini 2.5 Apache + Gunicorn systemd Google Sheets API Magic Link Auth

Need a system like this?

I build practical, custom web tools that replace spreadsheet chaos with real, maintainable workflows.

Let's talk