Inspiration
During catastrophic wildfires like the Marshall Fire in Colorado or the Caldor Fire in Lake Tahoe, thousands of families watched emergency maps showing fire perimeters miles away—only to have burning embers crash through their attic vents and ignite their roofs minutes later. Post-wildfire forensic studies from NIST and CAL FIRE reveal a chilling reality: up to 90% of homes destroyed in wildland-urban interface (WUI) fires are never touched by the main flame front. They are ignited by windborne embers (firebrands) projected miles ahead of the blaze. Standard fire alert apps only show where the fire has already burned. They treat wildfires like static perimeters, leaving millions of homeowners in forest-bordering communities blind to the single most critical predictor of immediate danger: wind direction relative to the fire and their property. We built EmberWatch to make this invisible danger visible and actionable. By fusing real-time satellite hotspot feeds with live meteorological wind vectors, EmberWatch calculates a pinpoint, downwind Ember Threat Index (0–100) right on a resident's phone—giving families the life-saving minutes they need to harden their homes or evacuate safely.
What it does
EmberWatch is a native Android and iOS mobile application specifically engineered for citizens living in and around forest borders and WUI communities.
- Hyperlocal 6-Factor Ember Threat Index Instead of generic "fire danger" ratings that cover entire counties, EmberWatch computes an exact hyperlocal threat score: Ember Threat Index=Fprox+Fwind+Fdir+Fint+Fdry+FvegEmber Threat Index=Fprox+Fwind+Fdir+Fint+Fdry+Fveg
- Fire Proximity (Fprox∈[0,30]Fprox∈[0,30] pts): Great-circle distance calculated via the Haversine formula within a 50 km threat radius: Fprox=max(0,round(30×(1−dkm50)))Fprox=max(0,round(30×(1−50dkm)))
- Wind Velocity (Fwind∈[0,25]Fwind∈[0,25] pts): Dynamic wind force scaling danger propagation: Fwind=min(25,max(0,round(vmph×0.65)))Fwind=min(25,max(0,round(vmph×0.65)))
- Wind Direction Toward Property (Fdir∈[0,20]Fdir∈[0,20] pts): Evaluates whether the user's property sits in the crosshairs of the fire's downwind ember plume: Fdir=max(0,round(20×(1−Δθ90∘)))for Δθ≤90∘Fdir=max(0,round(20×(1−90∘Δθ)))for Δθ≤90∘
- Fire Intensity (Fint∈[0,10]Fint∈[0,10] pts): Derived from VIIRS satellite thermal radiative power (FRP) and NIFC reported burn acreage.
- Atmospheric Dryness (Fdry∈[0,10]Fdry∈[0,10] pts): Fuel moisture proxy based on real-time relative humidity (RH ≤12%≤12% triggers peak Red Flag scores).
- Vegetation & Fuelbed Risk (Fveg∈[0,10]Fveg∈[0,10] pts): Proximity to USFS National Forest boundaries and wildland-urban interface borders. ## How we built it Frontend Framework: React Native with Expo SDK 57 (TypeScript).
- Mapping Engine: Leaflet integrated via react-native-webview rendering Carto Voyager raster tiles with authentic API key authentication, eliminating external Google Maps API key dependencies and blank-screen bugs.
- Weather & Wind Sensors: Parallel queries to NOAA National Weather Service (api.weather.gov) and high-resolution Open-Meteo satellite observational grids with decimal wind velocity (0.1 mph) and live timestamp cache-busting.
- Wildfire Hotspots: NASA FIRMS VIIRS satellite thermal detection (375m resolution) + National Interagency Fire Center (NIFC) ArcGIS Open Data REST API.
- Forest Boundaries: USFS National Forest boundary polygons bundled locally for instant offline spatial intersection.
- Native Android Toolchain: OpenJDK 17, Android SDK 35, and Gradle building release-signed standalone APKs. ## Challenges we ran into
- Inverting Meteorological Wind Vectors: In meteorology, wind direction is reported as the direction the wind is coming from (e.g., a "North wind" at 0∘0∘ blows toward the South at 180∘180∘). Early prototypes inverted this, pointing the ember plume backward! We corrected the vector physics: θember_travel=(θwind_from+180∘)(mod360∘)θember_travel=(θwind_from+180∘)(mod360∘) This guaranteed that the ember cone always points directly downwind from the active fire.
- The "API Key Required" Tile Watermark: When testing Carto basemaps, tiles suddenly rendered with a diagonal "API KEY REQUIRED" watermark across the entire screen. Researching the API revealed that while Carto documentation mentions api_key=, their new raster endpoint strictly validates the query parameter ?key=YOUR_KEY. Passing the key correctly eliminated the watermark completely.
- Coordinate-Specific Wind Persistence: When users selected different cities from search chips, the wind speed occasionally appeared static because an earlier simulation preset kept state in storage. We restructured the context pipeline to force an immediate switch to live mode and added micro-timestamp query parameters, ensuring every coordinate change triggers a real-time wind query.
- Windows Device Guard Policy during APK Compilation: During the release APK build, Windows Application Control blocked the local Hermes compiler binary inside node_modules. Instead of disabling Hermes and sacrificing runtime performance, we routed Gradle's hermesCommand in app/build.gradle to the system's trusted, signed compiler binary, allowing the release build to succeed in Hermes bytecode format.
- Android 15 Edge-to-Edge Navigation Overlap: On Android 15 devices with gesture navigation, standard tab bars were clipped beneath the system bar. We resolved this by integrating useSafeAreaInsets to dynamically float the navigation and map overlays above the native system bar. ## Accomplishments that we're proud of Zero-Proprietary Lock-in: The app requires zero paid Google Maps or Mapbox API keys. It renders fully interactive, satellite-switchable terrain maps out of the box.
- 100% Test Coverage on Risk Calibration: Designed a 28-test automated suite verifying each factor of the Ember Threat Index against live NOAA and NIFC endpoints.
- Standalone Release APK: Compiled a complete 34.9 MB release-signed Android package (EmberWood-v4.apk) that installs seamlessly on Android 9 through Android 15 devices.
- Turning Fear into Action: Instead of panic-inducing red maps, EmberWatch gives clear, practical directives (e.g., "Move outdoor cushions downwind; shut crawlspace vents; escape heading: SE"). ## What we learned Wildfire Dynamics: How wind velocity exponentially widens the ember cast corridor, and why small defensible-space actions in the first 5 feet (Zone 0) prevent the majority of home structure fires.
- Resilient API Architecture: How to build dual-layer fallback systems (NOAA NWS + Open-Meteo satellite observations) so life-safety tools never crash when a single government server is congested.
- Cross-Platform Map Optimization: How to embed lightweight, responsive Leaflet webviews in React Native that render satellite imagery, vector polygons, and custom pulse markers at 60 FPS. ## What's next for EmberWood Neighborhood Mesh Alerts: Peer-to-peer Bluetooth/Wi-Fi Direct alert propagation to notify neighbors even when cellular towers burn down.
- 3D Terrain Ember Trajectories: Integrating USGS digital elevation models (DEM) to simulate how canyon winds and mountain ridges channel ember storms.
- Smart Home Vent Triggers: Home Assistant and IoT integrations that automatically close motorized attic vents and activate exterior sprinkler defenses when high ember risks are detected.
Built With
- and
- carto-basemaps
- esri-satellite-imagery
- nasa-firms-(viirs)
- nifc-wildfire-rest
- open-meteo
- openstreetmap
- typescript-&-javascript-|-apis:-noaa-nws
Log in or sign up for Devpost to join the conversation.