SF Location Intel
A hackathon prototype for a nonprofit newsroom that pulls San Francisco open data about a street into one view, plus a daily email digest of newly registered businesses.
- When
- November 2025
- Stack
- Cloudflare Workers, FastAPI, Python, React, Mapbox, Supabase, SendGrid
The problem
A local reporter covering a block has to query several city datasets separately to see what is happening there. Mission Local, a nonprofit newsroom, set the challenge at Hack for Social Impact 2025: put building permits, police incident reports, and registered businesses for a street in one place.
What we built
| Piece | What it does | Stack |
|---|---|---|
| Email worker | Runs on a daily schedule, fetches businesses newly registered in San Francisco, and emails a digest with map links | Cloudflare Workers (cron trigger), SendGrid |
| Backend | Takes an address and returns permits, incidents, and businesses for that street, with simple volume alerts | Python, FastAPI, httpx |
| Front end | Single-page search UI for the backend | React, Tailwind |
| Map app | Map-based version of the search with cached lookups | TypeScript, React, Mapbox, Supabase |
Data comes from the city’s open data portal, data.sf.gov, through its Socrata API.
My part
This was a team project. My main part was the scheduled email worker; the other pieces were team efforts. We worked with AI-assisted tooling throughout, which is how a small team shipped four working pieces during one event.
Cleaning it up afterwards
Before publishing the code I went back through it:
- Removed API keys and personal email addresses and replaced them with environment variables.
- Updated URLs after the city moved its portal from
data.sfgov.orgtodata.sf.gov. - Fixed the backend search so street names match the way the datasets store them, and updated the business query to the dataset’s current column names.
- Changed the worker schedule from every minute, which we used for the demo, to once a day.