NYC Campaign Finance
A full-stack platform for analyzing roughly 400,000 NYC campaign finance donor records. The hard problem is identity, not scale: the same person appears across filings under dozens of spellings of their name, address, employer, and occupation, so nothing useful can be counted until those variants are collapsed. The pipeline runs entity resolution over the raw filings using fuzzy and phonetic matching to merge them into single donors, then works on the resolved graph — detecting donation communities with Louvain community detection over shared giving patterns, and flagging potentially coordinated activity through temporal burst detection, where a cluster of donors gives to the same recipient in an unusually tight window. The architecture is split by language strength: a React and TypeScript frontend, an Express and Knex API, BullMQ workers on Redis to run resolution jobs that take far too long for a request cycle, and a separate FastAPI service in Python carrying the matching and graph work with NetworkX, python-louvain, jellyfish, and thefuzz. PostgreSQL with the pg_trgm extension backs fuzzy search across the whole donor set.
Visit project