ReachGuard 🛟

A small button. A clear handoff. Someone who says, “I can help.”

💡 Inspiration

You leave the library late. Halfway home, you feel unwell. You want someone you trust to know—but unlocking your phone, finding a contact, and explaining everything suddenly feels like a lot. You manage to send a message. Then comes the harder question: Did anyone actually take responsibility for helping? That gap became the focus of ReachGuard. We brought together two projects: a wearable emergency-assistance prototype and CallGate, an existing system for scoped contact verification and auditable events. During the hackathon, we built a shared help-response workflow around a simple idea: Sending a request and having someone accept it are two different moments. People should be able to tell them apart.

🛟 What it does

ReachGuard connects a wearable help trigger, an iPhone gateway, and a contact response page.

The intended experience is simple:

  1. Press and hold. Initiate a help request, with a short cancellation window to catch accidental activation.
  2. Pass it through the phone. The iPhone receives the device event over Bluetooth and uploads it.
  3. Let a contact respond. An assigned contact opens their authorized page and chooses whether they can help.
  4. See the handoff. The dashboard shows what actually happened, including when the backend recorded the request and when the contact accepted it.

Our prototype separates three states that are easy to confuse: Phone received → Backend recorded → Contact accepted

A Bluetooth acknowledgment does not mean someone is coming. A successful upload does not mean a person has seen the request. “Contact accepted” means the contact has explicitly agreed to take responsibility; it does not claim that help has arrived. The wearable design supports Emergency, Medical, and Family requests. These are requests to configured contacts—not automatic calls to police, hospitals, or emergency dispatch.

⚙️ How we built it

Wearable: Arduino Nano 33 BLE Sense Rev2, using an nRF52840, physical buttons, and BLE. The firmware design includes long-press activation, debouncing, a cancellation window, acknowledgment handling, and bounded retries.

iPhone gateway: Swift and CoreBluetooth. The gateway is designed to decode an Alert, save it locally before acknowledging receipt, and upload a help_request. Configuration stays on the phone, with the device credential stored in Keychain.

Backend: Python, FastAPI, and SQLite. Each request has a stable event ID. Retrying the same event returns the existing record; reusing its ID with different content is rejected.

Contact coordination: Separate permissions for device submission, contact responses, and dashboard viewing. A device credential can submit a request, but cannot accept it on a contact’s behalf.

Interface: An English dashboard and mobile contact page with a readable event history, clear response states, and explicit connection errors.

Emergency assistance does not require a payment challenge, a transaction amount, or a fraud detector’s permission to begin.

🧪 What we have demonstrated

We completed a real phone-to-backend-to-contact rehearsal:

-An iPhone Shortcut submitted a new help request over HTTPS. -The backend recorded it under its event ID. -An authorized contact responded from an iPhone. -The dashboard displayed Contact accepted for that same request.

We matched the event ID across the receive record and response history and recorded the demonstration.

We also demonstrated the complete hardware workflow: a physical button press, BLE reception by the Swift iPhone gateway, successful backend upload, and contact acceptance displayed on the dashboard for the same event ID. We recorded this demonstration.

🧩 Challenges we ran into

A request should survive a retry without becoming a second emergency

A connection can fail after the server has already received an upload. Creating a new event ID on every attempt would make one incident look like several. We use stable event IDs and persistent deduplication so retries refer to the same request.

Network failures became part of the product work

Campus connectivity and interrupted tunnels repeatedly affected testing. We had to distinguish a local service failure from an unavailable public endpoint, restore connectivity, and preserve the original records and credentials.

This also shaped the interface: an offline connection must remain visibly offline, rather than looking like an empty inbox.

Our first integration asked the wrong question

We initially connected the wearable event to CallGate’s payment-verification flow. It worked technically, but made someone asking for help pass through steps meant for authorizing a transaction.

We changed direction. ReachGuard now gives help requests their own response workflow, while preserving the separate payment prototype.

That decision made the product easier to explain—and more faithful to the person using it.

🏆 Accomplishments we’re proud of

-Completing a real iPhone request-and-response loop across separate role interfaces. -Keeping device acknowledgment, server receipt, and human acceptance distinct. -Handling duplicate requests, conflicting IDs, cancellation, and concurrent responses with an auditable history. -Turning separate hardware and backend efforts into a shared interface contract.

Building a backup demonstration while keeping unverified hardware claims out of our results.

📚 What we learned

The most useful feedback in a stressful moment may be very small:

“Your request was recorded.”

Then, only when it is true:

“Someone accepted it.”

Designing around those statements forced us to examine every acknowledgment, permission, and screen. It also gave the two halves of our team a concrete integration target: one event, traced from its origin to a person’s response.

🚀 What’s next

Our next priority is broader testing of the complete workflow under interrupted connectivity, across different iPhone states, and with multiple contacts.

After that, we want to evaluate interrupted connectivity, unanswered requests, and cancellation with prospective users. We also plan to explore accessible device feedback and ways to reach another contact when the first cannot help.

ReachGuard is a research prototype with configured demo contacts. It does not establish verified human identity, dispatch emergency services, or guarantee a response.

Our first goal is concrete: make a request for help become a visible, accountable handoff.

Source code: https://github.com/Cyberchopin/reachguard

Built With

Share this project:

Updates

posted an update —

ReachGuard — Additional Technical Details and Project Update

We wanted to share a few details that didn't make it into our original submission, especially about the wearable firmware, hardware validation, and contact escalation.

1. Embedded wearable and interaction design

Reach began with a simple goal: make asking for help easier, especially for older adults who may not have their phone within reach during an emergency.

Rather than building another multifunctional smartwatch, we focused on a lightweight, purpose-built wearable with straightforward physical controls and a minimal learning curve.

Our Arduino Nano 33 BLE Sense Rev2 prototype uses three dedicated buttons: Emergency, Medical, and Family.

The embedded C++ firmware includes a finite-state machine, interrupt-driven input handling, 30 ms debouncing, a 1.5-second hold requirement, and a five-second cancellation window. It also handles overlapping button presses and a button held continuously without release.

2. BLE reliability and acknowledgment

We implemented a custom BLE Alert/ACK/Status protocol with bounded retries and explicit LED feedback.

A successful Bluetooth transmission isn't treated as proof of delivery. The iPhone gateway saves an alert before sending an application-level ACK.

If the gateway doesn't acknowledge the alert, the wearable retries and eventually displays an error rather than falsely reporting success.

3. Priority-based contact escalation

An important feature built during this hackathon was our new contact escalation workflow, extending CallGate's pre-existing authentication, contact roles, and audit infrastructure.

Instead of sending one notification and stopping, the system prioritizes close family members and continues to other configured contacts when someone doesn't respond.

If a contact selects "I can't help," the request moves to the next contact immediately. "I can help" records acceptance and stops the active rotation.

This is currently implemented through authorized web pages, not real phone calls.

4. Testing and validation

Our recorded development tests include:

  • 85/85 embedded firmware unit tests passed.
  • 22/22 iPhone gateway unit tests passed.
  • 100/100 repeated BLE happy-path tests passed.
  • Real-hardware testing of buttons, cancellation, reconnects, and acknowledgments.
  • A one-hour BLE bench test with 410 of 417 measured alerts delivered. The seven unsuccessful deliveries were associated with Bluetooth disconnections and surfaced as errors; the device did not reset.

We also demonstrated a real physical button press traveling through BLE, the iPhone gateway, backend persistence, and contact acknowledgment for the same event.

What matters most to us is where the complexity lives.

The person asking for help should only need a simple physical action. The system handles delivery, retries, contact priority, and response tracking.

Simple for the wearer doesn't mean simple to engineer.

ReachGuard is a hackathon research prototype. It currently requires a nearby iPhone gateway and does not provide emergency dispatch or two-way wearable voice calls.

Firmware and iPhone gateway repository:
https://github.com/Iridium0317/WearableEmergencyAssistanceSystem

Integrated ReachGuard repository:
https://github.com/Cyberchopin/reachguard

Log in or sign up for Devpost to join the conversation.

Submission history