PulseMap: Environmental Health Screening
Third place at Esri's Weekend of Innovation 2026. Address-level environmental-health screening for the San Joaquin Valley, with AI explanations in English and Spanish.
- React
- TypeScript
- Vite
- ArcGIS Maps SDK for JavaScript
- Calcite
- OpenAI / Azure OpenAI
- ArcGIS Online
- ArcGIS Pro
Results
3rd
place at Esri's Weekend of Innovation 2026
5
counties in the study area
4
hazard source types scored by distance
2
languages: English and Spanish
Data from CDC PLACES, CalEnviroScreen 5.0, and EPA facility registrations, processed in ArcGIS Pro and published as hosted layers on ArcGIS Online.
Problem
Your health depends on where you live. California's San Joaquin Valley has some of the worst air quality in the country, and Fresno County residents ranked environmental conditions as their top health concern in the county's 2026 Community Health Assessment.
The tools that measure environmental burden today work at the census-tract level and are built for regulators, not residents. A family wants to know about their block, in language that helps them act. Newer hazards such as data centers are also spreading faster than regulators can track them.
My role
Team project: six of us, team Arcitects, built PulseMap at Esri's Weekend of Innovation 2026 (the Esri Intern Hackathon) and placed third. Teammates led the data pipeline, the scoring research, the design, and the pitch.
I was one of the developers. I worked on the app's core functionality and user experience: the AI-generated explanations of each score, the 2D and 3D map features, filtering tools, English and Spanish support, and custom visualization components. I also handled performance improvements, bug fixes, UI refinements, and the changes that came out of testing.
Architecture
Diagram source (Mermaid)
flowchart TD A["Resident enters an address"] --> G["Geocode with autocomplete (ArcGIS)"] G --> V["Tier 1: tract vulnerability (health, socioeconomic, water, air)"] G --> H["Tier 2: nearby hazards (facilities, CAFOs, data centers, highways)"] H -->|"distance decay per source"| S V --> S["Environmental Burden Score = vulnerability x hazard"] S --> M["2D or 3D map with nearby sources and distances"] S --> X["AI plain-language explanation (OpenAI / Azure OpenAI)"] M --> L["English or Spanish"] X --> L
Key decisions and tradeoffs
- Multiply the two tiers instead of adding them
- The burden score is vulnerability times hazard, so a place scores high only when both are elevated. A vulnerable tract with no nearby sources, or a hazard next to a well-resourced tract, does not get flagged as the worst case.
- Keep ambient air quality in the vulnerability tier
- Ozone, PM2.5, and diesel are measured per census tract, so they belong with the other tract-level vulnerability factors. The hazard tier stays address-level, measuring distance to specific sources. Splitting it this way represents air pollution without counting it twice.
- Ship the reliable 3D view
- The first plan was a continuous raster 3D scene driven by a live address-level query. That was more than the team could build reliably in a weekend, so we switched to extruding the tract-level score as 3D polygons. Getting the app to switch smoothly between the 2D and 3D views took more front-end work than expected.
- Screening, not diagnosis
- Every score is framed as screening. The app shows where hazard and vulnerability overlap and never claims a source caused anyone's illness. The AI explanation suggests questions to bring to a doctor rather than conclusions.
What I'd improve next
- Support more languages.
- Let users adjust the score weights to match the pollutants that matter most in their community.
- Pull data updates automatically from EPA, CalEnviroScreen, and CDC PLACES through their APIs.