RiskSense
RiskSense is a global emergency intelligence and early-warning platform that combines live hazard feeds, an interactive globe, a normalized event model, and location-aware alerts to help people understand what is happening in the world and what it could mean for them.
Instead of relying on static maps or a dozen disconnected agency sites, RiskSense brings hazard monitoring, event detail, personal area alerts, community reporting, and emergency assistance into one interactive, map-centered workspace.
π The Inspiration
A wildfire, a flash flood and an earthquake are all public information.
The data already exists β NASA satellites, USGS seismometers, national weather services. But it is scattered across a dozen sites, each with its own format, its own jargon, and its own idea of what "confirmed" means.
We kept coming back to a simple question:
What is happening near me right now, how reliable is it, and what should I actually do?
Answering that meant opening ten tabs and guessing which numbers were comparable. That question became RiskSense.
β The Problem
| Problem | Why It Matters |
|---|---|
| π Scattered data | Hazard feeds live in separate silos with incompatible schemas and severity scales. |
| π°οΈ Detection β confirmation | A satellite hotspot is a thermal anomaly. Flares and farm burning look identical. |
| β±οΈ Unknown freshness | A quiet feed looks the same as a broken one unless the platform says which it is. |
| π Emergency numbers vary | There is no universal emergency number. Assuming 911 everywhere can be fatal. |
| πΊοΈ No personal anchor | People need to know whether an event could reach their location, not the world's. |
| β οΈ Overclaiming | Dashboards that invent severity or response activity create false confidence. |
The deeper problem is that hazard information is often available β but not connected to a place, a time, or a decision.
β The Solution
RiskSense turns public hazard data into one honest, map-centered experience.
Every source is converted into a single HazardEvent, so the map, the feed, the alerts and the statistics all read the same shape.
1. πΊοΈ Interactive Global Map
- Rotate, zoom and pan a MapLibre globe, or switch to a flat projection
- Search any city, region or country
- Use My Location and return to it at any time
- Select hazard layers and toggle heat fields
- Click any event to open its detail view
- Right-click (or long-press) to report what you can see at that spot
2. π°οΈ Real-Data Hazard Feeds
RiskSense reads only keyless public sources β no mock event feed exists in the running product:
- USGS β earthquakes, with magnitude, depth and coordinates
- NASA FIRMS β satellite fire detections, with confidence and fire radiative power
- NASA EONET β global natural events
- GDACS β global disaster alerts (EC JRC / UN OCHA)
- NOAA / NWS β official US weather and flood warnings
Availability, coverage and update frequency depend on the publisher.
3. π‘ Normalized Event Model
Each event carries a hazard type, coordinates, detection time, source, severity, confidence, status, geometry and data freshness β with severity, confidence and status as three separate fields, each stating its basis.
4. π¨ Personal Area Alerts
Add the current map view or a searched place to personal alerts, choose hazards and a minimum severity, and opt in to notifications. A quiet feed is never presented as proof of safety.
5. π§βπ€βπ§ Community Reports
Report fire, flooding, a blocked road, severe damage or a resource need. Reports are coarsened to about 1 km, stored as pending, marked unverified, and can never trigger a dispatch.
6. βοΈ Emergency Assistance
Resolves verified, country-specific numbers from your location across an 84-country directory, shows official guidance, and maps nearby services via Overpass.
π The RiskSense Workflow
ββββββββββββββββββββββββ
β Fetch Public Hazard β
β Feeds β
ββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββ
β Normalize to One β
β HazardEvent β
ββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββ
β Dedupe Β· Filter Β· β
β Rank by Severity β
ββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββ
β Render Globe, Feed β
β and Freshness β
ββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββ
β Match Against My β
β Alerted Areas β
ββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββ
β Confirm and Reach β
β Official Help β
ββββββββββββββββββββββββ
RiskSense connects observation, interpretation and action into one continuous workflow.
β¨ Key Features
| Feature | Description |
|---|---|
| πΊοΈ Interactive Globe | MapLibre globe with per-hazard heat fields and typed markers. |
| π°οΈ Live Event Feed | Real events with severity, confidence, status and freshness. |
| π Filters | Hazard, severity, source and time window (6 h / 24 h / 72 h / 7 days). |
| π Event Details | Source, authority, coordinates, and explicit satellite-detection labels. |
| π¨ Area Alerts | Watch a map view or place, choose hazards and thresholds. |
| π§βπ€βπ§ Community Reports | Coarsened, unverified pins that can never auto-dispatch. |
| βοΈ Emergency Directory | 84 countries, each entry flagged verified or not. |
| π₯ Nearby Services | Hospitals, fire and police stations from Overpass. |
| π Observatory | Country summaries and statistics computed from retrieved data only. |
| π Transparency | Data-source directory, methodology, limitations, and an OpenAPI spec. |
ποΈ How We Built It
RiskSense is built around one principle:
The data layer should be honest, and the reasoning should be inspectable.
It runs with no API keys and no required backend.
βββββββββββββββββββββββ
β User β
ββββββββββββ¬βββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββ
β RiskSense UI β
β Next.js Β· React Β· TypeScript β
ββββββββββββββββββ¬βββββββββββββββββ
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββ
βΌ βΌ βΌ
βββββββββββββ βββββββββββββββ βββββββββββββββ
β Globe β β Live Feed β β Emergency β
β Map β β + Filters β β Assistance β
βββββββ¬ββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ
β β β
βββββββββββββββββββββββΌβββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββ
β Hazard Engine β
β Dedupe Β· Filter Β· Alertβ
ββββββββββββββ¬βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Normalized Event β
β Model β
ββββββββββββββ¬βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Adapters (one file β
β per source) β
ββββββββββββββ¬βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Public Data β
β USGS Β· FIRMS Β· EONET β
β GDACS Β· NWS Β· OpenFree β
βββββββββββββββββββββββββββ
π₯οΈ Frontend
Next.js 15 App Router with React 19 and strict TypeScript, styled with Tailwind CSS 4. MapLibre GL JS renders the globe, Recharts the charts, and Zod validates upstream payloads.
Feature code lives under apps/web/src/app/* and apps/web/src/components/*, the domain model in packages/shared, adapters in packages/data-sources, and aggregation in packages/hazard-engine.
π§© The Adapter Pattern
The most important engineering decision in RiskSense is that no UI code knows which agency a record came from.
Each source is one adapter that fetches a real feed and returns HazardEvent[]. Adding a source is one new file and one registry line:
export const ADAPTERS: HazardAdapter[] = [
new UsgsEarthquakeAdapter(),
new GdacsAdapter(),
new NasaEonetAdapter(),
new NwsAlertsAdapter(),
new FirmsWildfireAdapter(),
];
π Alert Matching
A monitored area is a radius on the Earth's surface, not a bounding box. Matching uses the great-circle distance:
$$d = 2R\,\arcsin!\sqrt{\sin^2!\left(\tfrac{\Delta\varphi}{2}\right) + \cos\varphi_1 \cos\varphi_2 \sin^2!\left(\tfrac{\Delta\lambda}{2}\right)}$$
π Honesty Enforced in the Data Model
The EventStatus lifecycle is ordered β detected β under-review β confirmed β warning β resolved β and AI may not promote an event past detected:
/** Lifecycle state of an event. AI may not promote an event past `detected`. */
export type EventStatus =
| "detected"
| "under-review"
| "confirmed"
| "warning"
| "resolved";
Official guidance text is carried verbatim from the authority and is never AI-authored. Unavailable, delayed and stale feeds have their own states and are shown as such.
π§© Challenges We Ran Into
1. Sources disagree about what "severe" means.
Five sources, five schemas, five severity scales. We kept severity, confidence and status as separate fields with a basis string on each, rather than flattening them into one invented number.
2. A satellite hotspot is not a wildfire.
FIRMS reports thermal anomalies. Industrial flares and agricultural burning register identically. Rather than hide that, we label every record as a detection (isDetection), carry the source's own confidence, and say so in the UI and the FAQ.
3. Drawing 1,200 fire detections. Individual markers become noise at world zoom. We replaced them with a per-hazard heat field weighted by severity, fading out as markers take over β so a dense field of minor detections never reads like one major event.
4. Emergency numbers could get someone killed. There is no universal emergency number. So the directory is country-specific, each entry records the official source it was verified against, and an unverified location says "Emergency contact not verified for this location." instead of guessing.
5. Making a quiet map impossible to mistake for safety. The platform states plainly that a quiet feed is not evidence of safety, and shows per-source freshness so an empty view is distinguishable from a broken one.
π Accomplishments We're Proud Of
- A single normalized
HazardEventmodel that five independent adapters feed into, across 12 hazard families - A globe that renders 1,300+ live events from 5 real sources with no API keys
- An 84-country emergency directory, each entry traced to an official government source
- Honesty encoded as a type:
EventStatuscannot be promoted by AI, and missing data has an explicit state - Community reports that are coarsened, unverified, and structurally unable to trigger a dispatch
- A fully keyless, self-hostable stack with a documented OpenAPI surface
π§ What We Learned
Honesty is an engineering discipline, not a disclaimer. It is easy to write "data may be delayed" in small grey text. It is much harder to design a system where the data model makes overclaiming difficult β where an event has a status that AI cannot advance, and where a stale feed has its own visible state.
Abstraction pays for itself immediately. Because every source produces the same type, adding a hazard source touches one file. The map, the feed and the alerts never learn a new agency's name.
Reading licences comes before reading data. Open-source code does not make third-party data open for redistribution. Every source in RiskSense is presented with its attribution and a link back to the original record.
Distrust a passing build. A green build says nothing about whether a WebGL globe actually draws. Verification had to happen in a real browser, on real data, at real zoom levels.
β οΈ Responsible Design
RiskSense informs people about danger and helps them reach appropriate assistance. It is not an official alert channel and not a dispatch system, and it says so on every page.
It never calls emergency services on the user's behalf, never auto-dispatches volunteers, and never uses AI to invent coordinates, severity, statuses or emergency instructions. A confirmation step precedes any call.
π€ AI-Use Disclosure
We used an AI coding assistant to help scaffold the monorepo, draft adapter and UI code, and review documentation. We directed the architecture, chose the data sources, defined the honesty rules the product follows, verified behaviour in a real browser, and reviewed every change before it was committed. We can explain the design decisions, the data model, and how the final product works.
π What's Next
- π Add regional flood and cyclone feeds where access terms allow
- β±οΈ A scheduled ingestion service that snapshots every source for historical analysis
- π§βπ€βπ§ Moderated community reports with verified-organization coordination
- πΆ Offline-tolerant alerts for poor-connectivity areas
- π Longer time-series for change detection on fire and flood extent
π Our Vision
We believe public-safety technology should make hazard information more accessible β and more honest.
The goal is not to show more markers or more data. It is to help people understand what the available data says, what remains uncertain, and what to do next.
Explore the world. Understand the risk. Act sooner.
RiskSense β global emergency intelligence from real public data.
Built With
- gdacs
- maplibre-gl-js
- nasa-eonet
- nasa-firms
- nextjs
- noaa
- node.js
- nominatim
- npm
- open-meteo
- openstreetmap
- overpass-api
- postgresql
- react
- tailwind-css
- typescript
- usgs
- vercel
