
Context
Maryland releases about 3,400 people a year from state custody, and roughly one in five returns to prison within a year. Getting released people housing, treatment, and work is the job of case managers across 7 state facilities and 24 local departments of correction.
PREPARE, a reentry nonprofit, asked me to digitize that workflow with its director. I owned product, design, and engineering. The users were case managers and reentry support specialists; the client was the nonprofit and, through it, the state's reentry effort.
Constraints
- 31 locations with different equipment and no IT support, so anything that needed per-site setup was out.
- A nonprofit budget: running costs had to be close to nothing.
- Parole packets contain legally mandated language that can't be paraphrased.
Problem
The most expensive symptom was the parole support letter. Each one took a case manager three or more hours to draft, working from paper intake forms, Salesforce data entry, and printed resource flyers. More than 200 programs and 500 supporting documents lived in places nobody could search.
A letter is only as good as the information behind it, so speeding up the writing alone wouldn't have fixed much.
North starTime for a case manager to get from intake to a reviewed, send-ready support letter.
Decisions
Build the whole chain, not just the letter writer
- Options
- A standalone tool that turns case notes into a letter, or an end-to-end system: intake, resource database, letter generation, review.
- Evidence
- Letter quality depended on structured intake upstream and a searchable resource base downstream.
- Chose
- End to end: a digital needs assessment, one central resource database that also serves as the retrieval corpus, RAG letter generation, and expert review.
- Didn't build
- A paste-in-your-notes letter generator.
- Cost
- A much larger 0→1 surface before the first useful letter.
Host it centrally instead of at each site
- Options
- Local Ollama models at each location, or a hosted stack.
- Evidence
- Setup across 31 locations was impractical.
- Chose
- One deployment on AWS EC2 and Bedrock, under $100 a month.
- Didn't build
- Per-site local model installs.
- Cost
- Every site now depends on one cloud deployment and a network connection.
Keep a person in the loop
- Options
- A larger model working alone, or a smaller, cheaper model with expert review.
- Evidence
- In testing the model invented resources, missed tone, and stated inaccurate facts.
- Chose
- A smaller model plus a subject-matter-expert review step between generation and delivery. The specialist stays the author.
- Didn't build
- Automatic sending of generated letters.
- Cost
- A person still spends about 30 minutes per letter instead of zero.
Take the AI out of the parts that can't be wrong
- Options
- Letting the model write the whole letter, or restricting it to a narrow extraction task.
- Evidence
- The model paraphrased legally mandated paragraphs and could invent phone numbers or addresses in the housing commitment that opens each letter.
- Chose
- Fixed structure lives in Python HTML templates. The model only extracts resources in a rigid format that a deterministic parser turns into HTML. The housing sentence is built in plain Python from existing data, with fallback wording when data is missing.
- Didn't build
- Free-form full-letter generation.
- Cost
- Less flexible letters, and every new letter type needs a new template.
Solution
Three pieces carry the decisions. A resource management interface migrated 200+ resources and 500+ documents into one database, scoped by state, county, and facility, and doubling as the retrieval corpus. The letter pipeline combines templates, constrained extraction, and a deterministic parser. And the embedding model is pinned to an exact snapshot, with a canary sentence checked at startup so a silent model upgrade can't quietly degrade resource matching.
Outcome
Drafting a support letter dropped from 3+ hours to about 30 minutes. The system runs on under $100 a month of infrastructure, and 200+ resources with 500+ documents now live in one searchable place.
Statewide, the project estimates about 8,500 case-manager hours a year freed (roughly 4 full-time roles) and $20M+ in annual savings, assuming fewer people return to prison. Those are projections, not measured results.
Do differently
- Put the review step in the first design. I added it after testing showed hallucinations; it's the reason the system went from a demo to something usable in production.
- Decide up front which parts of the pipeline shouldn't be AI. Templates and the housing sentence should have been code from day one.
- Track letters written per site from launch, so the statewide savings rest on measured usage rather than a projection.