Skip to main content
FUTURESELF

Case study

Private Prison Portfolio Screener (PPPS)

A public research tool for tracing investment ties to the private prison industry.

Completed August 2026

  • Civic Tech
  • AI & Agents

Impact

Retirement systems indexed
7,500+
SEC filings parsed
40k+
Flagged security identifiers tracked
~120
Production interface of the Private Prison Portfolio Screener at divest.futureself.us
Production interface of the Private Prison Portfolio Screener at divest.futureself.us

Problem Statement

In October 2025 I was inspired to dig deeper into the companies that run the ICE detention centers for ICE. The largest and its competitor stood out: GEO Group and CoreCivic. Both are publicly traded and are considered mid-cap companies. So I started reading their 13F filings and discovered that many retirement systems were invested. At this point my research was manual and not too deep - I was only scratching the surface and identifying the retirement systems that were directly invested, not those that had hidden investments through mutual funds or ETFs or through index funds. After a few quarters of updating my data by hand I looked for another way.

In June of 2026 I began experimenting with Claude Code to see what the current state of affairs was with agentic coding. After creating a few data analysis scripts for a different project, I sat down to build the Private Prison Portfolio Screener tool at https://divest.futureself.us. I got to say that this project came together much faster than I expected and with a few dozen iterations I had it ready for the public.

During those iterations I was able to solve several data sourcing problems including building a data ingest pipeline that takes unstructured Form 5500 PDF documents, OCRs them if they don’t have a text channel, parses them to identify the schedule of assets and normalize the data. This solved one big piece of the data puzzle: how to track down indirect investments in the smaller pension funds and employer retirement systems.

Lessons Learned

As a first large project I tackled with agents, I learned a few things. This project was quite iterative and similar in nature to an Agile/XP workflow. I described in prose what I wanted or what wasn’t working, or what I wanted to research and the agent did a shockingly good job at sorting out what I meant. A lot of the guidance I read about agentic coding was saying “tell it less, be less prescriptive” and it did work.

I’ll write more about my current workflow in a Lab Note soon.

I also learned that most models are terrible at user interface design. Their tendency is to conform to an average look and feel. Both average in quality and what seems to be an average of functioning sites. It’s a bit of work to get it to explore designs but I’ve got a few techniques. Still, nothing beats the human designer.

Another big discovery in this project was that Cloudflare has excellent tools for hosting applications just like this. I’m very happy with their products, their support for agentic engineering and business model. I expected to self-host this project on a VPS and I’m relieved I don’t have to do that!

Architecture & Technology Stack

The user interface is static-first and runs on Cloudflare’s Workers & Pages delivery network. I prefer static builds and used Astro to help with that. Structured data lives in versioned JSON and a read-only SQLite database compiled during the build and queried at the edge, so a page view is a cache hit rather than a database round trip.

The data pipeline is a scheduled Worker chain:

  • Ingest — pull institutional 13F-HR submissions from the SEC EDGAR full-text and submissions APIs, plus 5500 Schedule H and N-Port. Data is updated on demand.
  • Normalise — resolve CUSIP and ticker identifiers to a stable internal issuer id, fold in corporate-action history (renames, spin-offs, emergence from Chapter 11), and attach each row to the filing it came from.
  • Screen — join holdings against a maintained watchlist of issuers tied to private prison operations, detention facility management, and detention financing.
  • Publish — emit the JSON and SQLite artefacts that the next site build consumes.

R2 holds raw filing snapshots for reproducibility, KV holds small hot lookups, and a Pages Function exposes a narrow JSON endpoint for the few interactive queries the static build cannot pre-compute. Every displayed number links back to a primary source.

Next Steps

The two primary targets, GEO Group and CoreCivic, work with many other companies to operate the detention facilities. I’ve started to pull those relationships together to expand the targets to include companies like Aramark and others to discourage them from profiting off of human misery.

A Word About the Merits of Divestment

Our investments should reflect our values. I’ve discussed the impetus and effects in several webinars this year under the banner of the Coalition for Values-Based Investment. To learn more about divestment please go to the website https://sarahtowle.substack.com/s/coalition-for-values-based-investment/.