Screenshot of a form allowing users to submit public records requests.

For my master's thesis in Stanford's journalism program, I'm working on a project that involves getting records from a lot of different municipalities.

For data journalists, this is a pretty common problem. A lot of information journalists seek — death records, inspection records, you name it — is collected at the state, county, or municipal level. And data journalists often want to analyze that information across a wide geographic area.

In order to manage this work, I created a Django tool for filing public records requests to multiple agencies at once. I used an early version of this, django_sourcebook, to file requests for a reporting project. Since then, I've worked on building a more interactive version with authentication and tests. That project is foia_integration.

Map showing county-by-county results for Tim Kaine's 2018 Senate win over the Republican challenger, Corey Stewart

I wrote the front-end and back-end code to display precinct-level election results for northwest Virginia during the 2018 midterms.

As part of this process, I requested precinct shapefiles from 27 localities in Virginia; cleaned and joined the shapefiles using PostgreSQL and PostGIS; wrote code in Python to scrape the results and push them to an AWS S3 bucket; and wrote front-end code in d3 to display the results. I additionally set up an EC2 instance and ran the Python script from there so the script could continue running even if something happened to my computer locally.