Skip to content
Krishna Panjiyar
Full-StackML 3rd place Team project (6 people)

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

Architecture diagram: A resident's address flows through two tiers of scoring; the app shows the result on a 2D or 3D map with a plain-language explanation.Architecture diagram: A resident's address flows through two tiers of scoring; the app shows the result on a 2D or 3D map with a plain-language explanation.
A resident's address flows through two tiers of scoring; the app shows the result on a 2D or 3D map with a plain-language explanation. Open full size (opens in a new tab)Open full size (opens in a new tab)
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.