Global Recovery and Observation of Wildfires (GROW) is an AI-assisted wildfire intelligence console created by Team I.O β FlorianΓ³polis for the 2024 NASA Space Apps Challenge. The experience blends live satellite detections, historical context, and an OpenAI-powered voice co-pilot so emergency teams can explore evolving fire activity in seconds. π°οΈπ₯
π Top-10 worldwide finalist (Top 0.1%) in the 2024 NASA Space Apps Challenge. ποΈ Presentation slide deck: Open in Google Slides π° NASA announcement: Read the global winners recap
- π Satellite basemap with live and historical wildfire detections delivered through Mapbox GL clusters.
- πΊοΈ NASA FIRMS ingestion (MODIS Near Real-Time) with resilient caching so the dashboard stays responsive offline.
- π£οΈ Bi-directional voice co-pilot (OpenAI Realtime) that can search places, summarize risk, and trigger data drilling tools.
- π¦οΈ Contextual weather overlays via Open-Meteo (temperature, wind, precipitation gaps) to enrich situational awareness.
- π Inline analytics showing counts, brightness, FRP, and pixel metrics for any ad-hoc bounding box.
- π§ Slide deck lightbox and NASA Space Apps recognition baked into the experience for storytelling moments.
- π₯οΈ Front-end: React 18 + TypeScript with modular SCSS, custom components, and lightweight utility hooks.
- πΊοΈ Mapping: Mapbox GL JS handles clustering, markers, and smooth camera transitions.
- π°οΈ Data pipeline:
sql.jspersists NASA FIRMS observations in the browser (localStorage) for fast re-queries. - π§ AI assistant: Custom
RealtimeClientstreams audio to OpenAI Realtime models, exposing bespoke tools (geocoding, weather, database queries). - π Relay server: Optional Node.js WebSocket proxy (
relay-server/) to shield API keys and multiplex realtime sessions.
- Node.js 24 (use
nvm use) and Yarn 1.22.22. - Mapbox access token with Maps SDK enabled.
- NASA FIRMS βmap keyβ for the Area API (request at firms.modaps.eosdis.nasa.gov).
- Voice assistant access is provided through the hosted relay (no local OpenAI key required).
Create a .env file in the project root and populate:
REACT_APP_MAPBOX_KEY="pk.your_mapbox_token_here"
REACT_APP_NASA_MAP_KEY="your_firms_map_key"- π’ Select Node.js 24:
nvm install && nvm use - π¦ Install dependencies:
yarn install --frozen-lockfile βΆοΈ Start the React dev server:yarn start(launcheshttp://localhost:4317)- π Voice assistant sessions are brokered through our private server endpoint
/api/grow/relay, keeping OpenAI credentials on the server. - ποΈ Switch the βLIVEβ toggle to trigger fresh NASA downloads (first fetch may take a few seconds while CSV data parses).
- Run interactive tests:
yarn test - Build production bundle:
yarn build - Package the app (excluding bulky folders):
yarn zip
- π₯ NASA FIRMS (MODIS NRT): Primary wildfire detection feed; CSV area queries filtered to the Americas bounding box.
- π Mapbox Satellite: Base imagery and clustering logic for hotspots.
- π€οΈ Open-Meteo: Current weather snapshots to enrich assistant responses with temperature, wind, and days-since-rain.
- π§ OpenAI Realtime: Conversational agent with tool-calling for geocoding, map camera control, and statistics retrieval.
src/pages/Dashboard.tsxβ top-level layout, dataset toggles, overlays, and slide deck lightbox.src/components/mbox/β Mapbox integration, clustering layers, and observation highlights.src/components/realtime-voice/β Voice modal, audio pipeline, and custom tool handlers.src/utils/β NASA API client, sqlite helpers, geocoding utilities, and waveform rendering helpers.relay-server/β Lightweight WebSocket proxy built withws+openaiSDK.public/β Static assets, fallback GeoJSON, andsql-wasm.wasmrequired bysql.js.
- πΌοΈ Embedding in an iframe (e.g. ryan.zernach.com, zernach.com): Browsers block the microphone in cross-origin iframes unless the parent page grants it. Add
allow="microphone; autoplay"on the<iframe>(both are needed for capture and smooth audio playback). Example:<iframe src="https://your-dashboard-host" allow="microphone; autoplay" title="GROW dashboard"></iframe>. Nested iframes: each wrapping frame must include the sameallowvalues, or the innermost document still cannot use the mic. As a workaround, users can open the dashboard in a new tab from the voice panel. - πΆ Voice button greyed out? Ensure microphone permissions are granted and the realtime model name in code matches one enabled for your key.
- π Voice relay errors? Confirm the app can reach
/api/grow/relayand that the upstream OpenAI key is configured on the server. - π No live data? Confirm your NASA FIRMS key is active; the API limits requests per key and region.
- π§Ή Stale map data? Clear localStorage (key
wildfire_sqlite_db_v2) or toggle to βHISTORICALβ and back to βLIVEβ to force a refresh.
- π Licensed under the MIT License β see
LICENSE. - π Huge thanks to NASA, Mapbox, OpenAI, Open-Meteo, and the global Space Apps community for data, tooling, and inspiration.
Happy exploring, and stay safe out there! ππ²