NASA Space Apps Challenge Mountain View, CA 48-hour sprint · Oct 2025

XANHinsights

Every summer, the Bay Area sky turns orange. Heat builds in neighborhoods that already have the least green cover and worst air. City planners know something needs to change — but the data that could tell them exactly where to act first is buried across a dozen complex satellite portals, in formats only satellite scientists can read.

XANHinsights transforms raw NASA Earth observation data into a clear, actionable decision-support dashboard for urban planners.

48h
Build sprint
5
Team members
6
NASA datasets
30h
Data work alone
Kien Han
Data science, math, backend, frontend
Ngan Huong
Data science, backend, frontend
Linh Nguyen
PM — problem, strategy, feature, documentation
Tinh Ta
UX/UI — hi-fi wireframes, user flows
Thien Bui
Strategy, presentation
Data Pathways to Healthy Cities
Earth Science Division · Open-ended civic technology
  • 48 hours total
  • Complex satellite data formats
  • No domain expertise in urban planning or satellite science
  • No user research time
  • No iteration cycles
Defined the problem framing and product strategy
Built and prioritized the full feature system
Led cross-functional team of 5 for 48 hours
Owned storytelling, user flow, and recommendation layer
Collaborated with backend developers on data-to-product translation
Led UX/UI direction in Figma, centering planner workflows
XANHinsights screenshot 1 XANHinsights screenshot 2 XANHinsights screenshot 3 XANHinsights screenshot 4

The gap between data and decision

"Urban planners cannot efficiently identify which neighborhoods need green intervention most — because heat, air quality, and vegetation data exist in separate, inaccessible, non-synthesized sources."
Gap analysis
Current Pain
Environmental data exists but is fragmented across NASA portals in expert-only formats — planners and students cannot access or synthesize it without GIS expertise.
The Gaps
  • "Data exists" ≠ "data is usable" — a translation layer is missing
  • Scientific accuracy ≠ planning-relevant framing (Kelvin vs. risk index)
  • Satellite data shows a picture — it doesn't say what to do next
Desired State
  • Planner identifies highest-risk zone in under 3 clicks
  • Data synthesis across heat, air, vegetation is instant and visual
  • Dashboard output is directly actionable — not just informational
Tool Who it serves What it does Critical gap
Google Earth Engine Satellite researchers, data scientists Full-power geospatial analysis platform Requires coding expertise. No planning workflow. No recommendations.
NASA Worldview / Earthdata Scientists, researchers Raw satellite data visualization and download Data portal only. No synthesis. No actionability.
EPA EJScreen Policy analysts, EPA staff Environmental justice screening at census level US-wide but coarse. No scenario simulation. Not vegetation-focused.
ArcGIS / QGIS GIS professionals Full geospatial analysis and mapping Paid and expert-only. No built-in multi-indicator priority scoring.
XANHinsights ✦ Urban planners, NGOs, students Unified multi-indicator dashboard + priority score + scenario sim Built specifically for non-expert decision-making. Free. Open NASA data.

How it works

LayerToolRole
FrontendReact + TypeScript + CSS + Mapbox GL JSInteractive map, choropleth layers, district click interactions
BackendFastAPI (Python)REST APIs, entropy weighting engine, Priority Score computation
Data processingPython + Google Earth EngineRaster extraction, spatial joins, index normalization, CSV export
UI/UX designFigmaHi-fi wireframes, component design, prototype
Version controlGitHubCodebase management
Project coord.Notion + Google SheetTask tracking, timeline, documentation
DatasetProviderWhat it contributes
MODIS MCD19A2NASA GES DISCAerosol Optical Depth (AOD)
MODIS Land Surface TempNASA EarthdataUrban Heat Island (LST)
MODIS NDVINASA EarthdataVegetation coverage index
GPWv4 / SEDACNASA CIESINPopulation density
Copernicus GHSLEuropean CommissionBuilt-up area and urban extent
TIGER/Line 2023US Census BureauBay Area neighborhood boundaries

No off-the-shelf library handles this specific combination. The analytical engine has three components working together to produce a single, statistically defensible Priority Score per district.

1
Normalization
X* = (X - min) / (max - min)
Standardize indicator scales → comparable metrics
2
Entropy Weight
w = (1 - e) / Σ(1 - e)
Higher weight for indicators that vary significantly across districts
3
PCA Refinement
w = |loading| / Σ|loading|
Removes redundancy — heat and air quality co-move
4
Fusion
w_final = (w_entropy + w_PCA) / 2
Robust hybrid weights combining information + structure

Full derivation with proofs and implementation notes

description Full Formula
Raw ConceptProduct NameWhy
NDVI (-1 to 1)Vegetation IndexSpectral ratio means nothing to a planner
LST in KelvinUrban Heat Island (UHI)Maps to a concept planners already know
AOD 0–1 proxyPM2.5 / Air Exposure IndexThe term residents and planners already use
Raw density per km²Population ExposureFrames density as a risk multiplier, not a count
Entropy+PCA compositePriority ScoreSingle number replaces four confusing dimensions

Why this was harder than it looks

Our engineering team spent over 30 of 48 hours on data alone. Here is what that actually involved.

01
Tiled raster extraction
Raw satellite data as georeferenced pixel tiles — not clean tables.
hover to flip ↻
01
MODIS NDVI, LST, and AOD don't arrive as clean tables. Each is a georeferenced raster tile with spectral index values per pixel. We extracted tiles one by one, isolated each index in Python, rendered them as color-gradient map layers. The volume alone consumed most of 48 hours.
02
Stitching two incompatible map systems
Census boundaries vs. NASA raster grids — different CRS, different resolution.
hover to flip ↻
02
Bay Area boundaries came from TIGER/Line census data — a different coordinate system and resolution than the NASA raster grid. Aligning required cropping each raster to each neighborhood boundary, computing per-neighborhood index averages, exporting a unified CSV. The hardest technical step in the entire pipeline.
03
Temporal complexity
LST hourly, NDVI monthly — three datasets on three different time resolutions.
hover to flip ↻
03
LST is recorded hourly. NDVI and AOD are monthly composites. Producing a coherent per-district metric across all three required a 12-month averaging approach reconciling fundamentally different time resolutions. File sizes created processing bottlenecks on standard laptops throughout the build.
04
Building Priority Score with no existing library
Hybrid Entropy + PCA weighting — written entirely from scratch.
hover to flip ↻
04
The hybrid Entropy + PCA weighting formula was written from the ground up. No off-the-shelf library handles this combination. Entropy assigns higher influence to indicators that vary across districts; PCA removes redundancy between correlated ones. The result: one statistically defensible score per district.
05
Choosing proxy indicators without domain expertise
Every variable was a judgment call made from NASA docs under time pressure.
hover to flip ↻
05
NDVI, LST, and AOD are not self-evidently the right variables. AOD approximates PM2.5 imperfectly. LST measures surface temperature, not the air temperature residents experience. Each indicator choice was a judgment call made from NASA documentation — under time pressure, with no way to validate against real-world planning practice.
06
Translating data into what users understand
Kelvin, NDVI decimals, AOD coefficients — none of it means anything to a planner.
hover to flip ↻
06
Raw outputs were scientifically correct but unusable: LST in Kelvin, NDVI as a decimal, AOD as an optical depth coefficient. We had to decide what each indicator should be called, at what level of abstraction, and how to display it without losing meaning. That translation work produced the Heat Exposure Index, Vegetation Index, and Air Exposure Index naming.
07
Deterministic recommendations — a deliberate choice
Rule-based, not AI. In a planning context, explainability outweighs sophistication.
hover to flip ↻
07
Intervention recommendations are rule-based, not AI-generated. Each district's score across four components triggers a specific recommendation set. In a planning context, explainable outputs traceable to specific data signals are far more trustworthy than opaque model suggestions. Determinism was a feature, not a limitation.
08
Design and pipeline out of sync
Hi-fi wireframes built before real data existed — two tracks running on assumptions.
hover to flip ↻
08
Hi-fi wireframes were built while the data pipeline was still unfinished. The UI needed real district metrics — but for most of the build phase, that data didn't exist. We unblocked design by building on assumptions and mocked values so both tracks ran in parallel, then reconciled when real data came in.
"When I encounter a neighborhood environmental problem and need to act on it, help me quickly understand which areas need intervention most — and give me credible evidence and a clear path forward."
Primary Persona
Urban planner / city official
Prepares neighborhood-level environmental proposals and budget justifications
CONSTRAINT
No GIS expertise. Needs data that's fast to access, non-expert to interpret, and credible enough to present to city council
Secondary Persona A
Researcher / Analyst
Comparative study across Bay Area neighborhoods
CONSTRAINT
Spends most of analysis time on data wrangling, needs insight quickly
Secondary Persona B
NGO / Community educator
Building a local advocacy case or community education piece
CONSTRAINT
No technical background. Satellite data too complex.
Core functional and emotional jobs Targeted user insights
Use Case User Story Feature
UC1 — Find top priority zone "When preparing a proposal, I want to see which district has the worst combined profile, so I can justify where to invest first." Priority Zones mode + ranked hotspot list
UC1b "When comparing zones, I want to see why each ranked where it did, so I can explain it to city officials." Priority Score breakdown panel
UC2 — Explore neighborhood "When I click a neighborhood, I want to see its heat, air, and vegetation metrics together, so I understand its full environmental risk." Right-panel analytics + multi-indicator view
UC2b "When viewing a district, I want to see its trend over months, so I can assess if it's improving or worsening." Time-series line chart
UC3 — Simulate intervention "When choosing between interventions, I want to simulate NDVI increase and see projected temperature + air quality changes, so I can prioritize the highest-impact action." Scenario Planning slider
UC3b "When presenting to residents, I want visuals simple enough for non-experts, so the community understands the data." Color-coded map + plain-language summaries

User flow

User flow 1 overview
User flow 1 step 1 User flow 1 step 2 User flow 1 step 3
User flow 2 overview
User flow 2 step 1 User flow 2 step 2 User flow 2 step 3

What we chose and why

DecisionChosenRejectedTradeoff accepted
Scoring model Hybrid Entropy + PCA Simple average of indicators Higher technical complexity, but eliminates bias from correlated indicators. Defensible to judges.
Mode design Two modes: All Areas + Priority Zones Single unified view Adds navigation complexity, gains user-context match. Planner uses Priority Zones. Student uses All Areas.
Output type Actionable recommendations + impact estimates Data-only visualization Required more product thinking + content work, but closes the "so what" gap for the user.
Data scope 3 indicators (NDVI, LST, AOD) Add population density + zoning Reduced data pipeline complexity. Population density added later as overlay, not weighted in score.
HIGH IMPACT · LOW EFFORT
  • Priority zone ranking (top 10)
  • Color-coded map layers
  • Right-panel insights display
  • Recommended actions text
HIGH IMPACT · HIGH EFFORT
  • Hybrid entropy+PCA score
  • Scenario simulation engine
  • Geospatial data pipeline (GEE)
LOW IMPACT · LOW EFFORT
  • Generic AI feedback text
  • Long loading animations
  • Decorative onboarding tour
LOW IMPACT · HIGH EFFORT
  • User accounts
  • PDF export
  • Multi-city support
  • Mobile responsive layout

What's next

PriorityFeatureUser story it unlocksPersona
Now Socioeconomic overlay (income, demographics) "Show me if heat risk concentrates in low-income neighborhoods" Planner, NGO
Now Context-aware recommendations (budget / land / time filters) "Given I have $50k and 6 months, what should I do in this district first" Planner
Next Historical trend comparison (year-over-year) "Is this neighborhood getting worse or better over time" Researcher, Planner
Next PDF / slide export of district profile "I need a one-page brief for city council by Friday" Planner
Next Side-by-side district comparison "Show me Industrial East vs Port District across all indicators" Researcher
Later Multi-city support "Run the same analysis for Oakland, LA, and Houston" Researcher, Policy
Later Open data API "Integrate XANHinsights data into our city planning platform" Developer, Gov
Reflection

The hardest part wasn't the satellite data

XANHinsights started as a response to a hackathon prompt. It became proof of something more specific: the hardest part of making satellite data useful isn't just the satellite data.

The real question came after: how do we make this mean something to someone who has never opened a NASA portal in their life?

That translation — from spectral index to planning decision, from Kelvin to action — is where the actual product lives. It turns out this gap exists in every city that has environmental data but no clear path from data to decision.