Inspiration
In August 2023, a wildfire tore through Lahaina, Maui. Before the flames even arrived, the power and the phones went dead. Families fled with no warning and no way to call for help, and more than 100 people lost their lives.
The problem wasn't that help didn't exist. It was that nobody could say "I'm here," and nobody could say "this shelter is open." We wanted to build emergency updates that keep working when the towers don't.
What it does
Skywatch reads public hazard data (NOAA smoke plumes, National Weather Service alerts, air quality, river gauges) and texts each household one thing: what's happening near you, in your own language, and where to go. Voice agents phone shelters and resources to confirm they are really open, so you are only sent somewhere verified.
Blackout OS is the offline mode. With no signal, phones pass signed messages to each other, like neighbors passing a note down the street. When any one phone catches a signal, it becomes the gateway: it uploads everyone's messages in one batch and brings back a safety brief, a verified shelter, and blocked roads for the whole group. Responders can acknowledge a beacon, and the person trapped sees "Responders have seen your beacon." A chatbot answers questions like "where is the nearest shelter?" from the latest brief.
How we built it
- Backend: TypeScript on Node 20 with Hono, MongoDB Atlas for hazards, resources, users and mesh packets, deployed on Render.
- Delivery: Photon for iMessage and SMS, ElevenLabs voice agents for briefs and check-in calls, Gemini for alert rendering and chat, and Grok Voice for spoken post-call summaries.
- Safety fences: a brief validator that refuses to name any place, number or road not in the verified brief, plus consent handling where one STOP text ends all contact. Signature checks on webhooks fail closed.
- Mesh: every packet is signed on the device with WebCrypto Ed25519. Each report is scored when it syncs, with readable reasons, using
$$s = 0.5 + 0.2\cdot\mathbb{1}_{\text{inside hazard zone}} + 0.1\cdot\min(c,\,3)$$
where $c$ is the number of independent nearby reports from different devices. Rescue beacons never decay and cluster within 100 m, so a cry for help never fades.
- Frontend: an installable web app (PWA) with a safety brief, a map, a mesh tab for reports and chat, and a network-mode switch.
Challenges we ran into
- Trusting reports with no network. Anyone can type "flood on Main Street," so we made trust visible: signed packets, scores with reasons, and corroboration from other phones.
- Keeping the AI honest. An assistant that tells people where to go cannot invent a shelter. We added the validator and deterministic fallback templates, so the demo path works even if a live model fails.
- Browsers can't do Bluetooth mesh. We designed the relay around a local hotspot, and in the demo a relay page simulates it.
- Deciding what is real. Photo scoring is not wired to vision yet, and the demo runs on saved data. We chose to say that plainly.
What we learned
- Design for the worst moment, not the average one. Offline, simple, and forgiving beats clever.
- Trust is a feature. Explainable scores and fail-closed security matter more than a clever model.
- In an emergency path, a boring deterministic fallback is better than a perfect live answer.
What's next
Wire the photo check to a vision model, replace the relay page with real phone-to-phone links, and pilot with one county's emergency management office.
Built With
- cursor
- data
- ed25519-(webcrypto-signing)
- fema-open-shelters-(arcgis)
- gemini-(llm-wording
- geonames
- leaflet.js
- mongodb-atlas
- next.js-16
- noaa-hms-satellite-smoke-polygons
- node.js
- open-meteo-air-quality
- photon-2.0-(imessage-+-sms)
- react-19
- server-sent-events
- tiger
- typescript
- us-census-geocoder
- usgs-water-services
- validator-fenced)
- vitest
- wsdot-traffic-cameras
- xai-grok-voice-api-(tts-recap)
Log in or sign up for Devpost to join the conversation.