Inspiration

In a disaster, the people who need help most are often the ones who go silent. Their phone dies, the towers go down, or they can't make a call. Responders end up guessing who to check on first, while people with elderly relatives, kids or mobility needs wait. We wanted a system that notices silence, treats it as a signal, and gets the right help to the right person first, even when there's no signal at all.

What it does

ResQLink is a disaster-response module designed to sit inside an insurer's mobile app.

Sign up once: users opt in with their household: children, elderly dependents, pets and accessibility needs. Are you safe? When their area becomes a disaster zone and their phone has signal, they get a notification: "Are you safe, or do you need help?" One tap sends an SOS with their location and a note.

Silence is a signal: people whose phones stop checking in inside a disaster zone are flagged automatically and ranked by urgency, based on disaster severity, how long they've been silent, and vulnerability.

Three AI agents in a pipeline: Monitor warns everyone in the zone with safety steps for that disaster. Triage explains each case and tags what the person needs: medical, rescue, evacuation or security.

Dispatch picks the right services for the disaster type, writes the dispatch message, and sends it to fire, hospital and police plus the insurer. No signal? Mesh relay: phones pass SOS messages to each other over Bluetooth and Wi-Fi, hop by hop, until one reaches a phone with internet, which uploads them. Responder dashboard: a live ranked queue, map, case details, each agent's work, and one-click disaster simulations for Dallas (earthquake), LA (fire) and Miami (flood).

How we built it

Backend: SpacetimeDB. One TypeScript module holds the tables and all the server logic: a scan every 30 seconds that flags silent users, computes urgency scores and finds the nearest emergency center. Every change streams live to the dashboard and phones. AI agents: a Node worker that subscribes to the database and runs the Monitor → Triage → Dispatch pipeline. It runs on Gemini or NVIDIA Nemotron, switchable live from the dashboard. Every AI answer is checked against a strict schema, retried once, and replaced by a safe template if it's invalid.

Safety by design: code makes the critical decisions (ranking, distances, and the minimum services each disaster requires). The AI explains, advises and writes messages, and can add a service but never remove one. The server re-checks every dispatch.

Web app: React + Vite + Leaflet, with a phone-app preview built into the dashboard and real browser notifications through a service worker. Mesh: a shared routing module (tested over a simulated network of hundreds of phones) where each phone advertises how many hops it is from signal and forwards SOS messages toward the nearest one, with an Expo app on Google Nearby Connections.

Data: three fully synthetic disaster scenarios, plus 60+ automated tests.

Challenges we ran into

Choosing a Nemotron model: the model we planned on returned "not found" for our account. We tested every Nemotron variant to find one that worked. Then the reasoning model used up its whole answer budget "thinking" before replying, until we learned to switch thinking off.

One connection per user: SpacetimeDB allows one live session per identity, so the dashboard and the phone preview kept disconnecting each other. We gave the phone app its own identity.

Building for Android on Windows: a Bluetooth library shipped without a required build file, and Windows' 260-character path limit broke the native C++ build. We patched the library and built from a short folder path. Phone notifications: Android Chrome only shows them through a service worker, and only on secure pages, so we built a service worker and an in-app notification banner for demos.

Keeping AI trustworthy: early dispatch messages guessed people's gender from their names. We rewrote the prompts and enforced the rules in code, so the AI can't drop a required service or call something a "confirmed emergency".

Accomplishments that we're proud of

A working three-agent pipeline end to end: a disaster triggers warnings, triage and dispatch to multiple services, verified live on both Gemini and Nemotron.

It never breaks: it fails safely with no AI at all. Every agent has a fallback, and every result is labeled AI or fallback. A mesh relay that delivered every SOS in our simulated Los Angeles scenario (453 phones), hop by hop, to phones with signal.

The full story on one screen: disaster, "Are you safe?", SOS, agent dispatch and mesh, all on one dashboard. Honest wording throughout: alerts are always "welfare checks", never "confirmed emergencies", because a dead battery looks the same as a lost signal.

What we learned

AI fits best where it explains and communicates, with code making the life-or-death calls. That split made the system both smarter and more reliable. Reactive databases like SpacetimeDB make real-time, multi-device apps much simpler: no separate API or socket server to build. Real-world constraints shape the product: how browsers, Android and Bluetooth actually behave (secure pages, service workers, one session per user, radio range) mattered as much as the features. Prompting reasoning models takes care, from turning off "thinking" to stopping assumptions about people.

What's next for ResQLink

Field-test the Bluetooth mesh on real phones in a crowd, and support Android-to-iPhone links.

Signed SOS messages, so they can't be forged over the mesh, plus delivery receipts back to the sender.

Real integrations: CAD dispatch systems, 911 text gateways and insurer claim systems.

Live data: real weather alerts and news feeds driving the Monitor agent, with verified accounts.

Better battery use: low-power background check-ins and mesh duty-cycling, so phones last longer in a disaster.

Share this project:

Updates

Submission history