Here's a complete, self-contained HTML page covering your questions: MOB fatality statistics, prior art, battery-life math, app-survival settings, feasibility with AI coding tools, and a gotcha/risk checklist. Save it as `mob-system.html` and drop it into your site. ```html
A phone-heartbeat MOB watchdog for the trimaran seastead — and a gift to every other boat.
Status: concept review · All numeric estimates flagged where uncertain
| Your question | Short answer |
|---|---|
| How many people die per year from man-overboard events? | In the US alone, falls overboard kill roughly 150–260 recreational boaters per year (about a quarter to a third of all recreational boating deaths). Including commercial fishing and worldwide waters, the toll is plausibly well over 1,000/year. See §2. |
| Would most phones survive a day with this app running? | Yes — if the design is BLE-first, no phone-side GPS. Expect roughly 2–5 % battery per day of added drain. Wi-Fi-polling-every-second designs would burn 10–25 %/day. See §6. |
| Can a user set “never put this app to sleep”? | Yes on Android (battery-optimization exemption + foreground service; OEM-specific toggles too). Partially on iOS — no user override, but background modes keep a bonded BLE app alive reliably. See §7. |
| Could Claude Code / Cursor write the app and server? | Agree — the “hello world” pain you remember from Java ME is gone. An MVP is a 1–2 week job; a trustworthy v1.0 is 1–2 months part-time, dominated by real-device background-behavior testing and on-the-water RF tuning, not by typing code. See §12. |
| Would most family yachts have a computer able to run the server? | Yes — chartplotters are closed, but virtually every cruising boat has a laptop/tablet, and a $60 Raspberry Pi is ideal. Alarm output is trivial (relay + horn). Auto-stop via the autopilot is the only non-trivial retrofit on legacy boats; alarm-only mode is still valuable. See §11. |
| Has anyone done this already? | Close cousins exist — Exposure OLAS, Sea-Tags, MOBi-lert, Fell Marine MOB+, Autotether (all use dedicated tags, not phones); AIS MOB beacons and PLBs (manual/auto-activating distress radios). A mature open-source, phone-based, auto-return system appears to be an unfilled niche. See §3. |
Precise global numbers don’t exist; different agencies count differently. Best available anchors:
Treat all figures as order-of-magnitude. Even the low end justifies a cheap, universal mitigation.
| System | Type | Auto-detect? | Approx. cost | Notes / limitation |
|---|---|---|---|---|
| Exposure OLAS (Core / Guardian / T-2) | BLE tags + hub app | Yes — out-of-range or submersion | $150–500 + tags | Closest commercial cousin of your idea. Guardian can cut the engine. Uses dedicated tags, not phones; closed source. |
| Sea-Tags | Phone app + BLE wristbands | Yes | ~$100–200/tag | Racing-oriented; phone is the base station. Again: tags, not phones-as-transmitters. |
| MOBi-lert | Superyacht crew bands + base | Yes | $$$$ | Legacy superyacht system; proves the concept at scale but expensive and proprietary. |
| Fell Marine MOB+ | Wireless kill-switch hub + fob | Yes — stops engine | ~$300–400 | Replaces the physical kill-switch lanyard. Small-boat focused. |
| Autotether | Wearable fobs + base | Yes — submersion or range | ~$300–500 | Alarm + optional engine shutoff. Same architecture as yours with fobs. |
| AIS MOB beacons (Ocean Signal MOB1, ACR, Kannad) | Self-activating radio (AIS + DSC) | Yes on inflation/manual | $300–400 each | Alerts all nearby AIS vessels + your VHF. Gold standard for offshore; requires a life jacket to be effective. |
| PLBs / EPIRBs (406 MHz) | Satellite distress | Manual (some auto) | $300–800 | Global SAR-grade. Not a real-time “stop the boat” system — it summons rescue services. |
| Chartplotter MOB button (Garmin/Raymarine/B&G) | Software function | No — someone must press it | Free (built in) | Marks datum and steers a return course. Useless if the MOB is unwitnessed or crew is solo/panicked. |
| Smartwatches (Apple Watch fall detection + satellite SOS, Garmin incident detection) | Consumer wearable | Fall yes; submersion degrades touchscreens | $300–800 | Nice complement; depends on connectivity and wearer configuration. |
| Voyage-check-in apps (e.g., SafeTrx) | Phone app + shore contact | No — trip-level only | Free/$ | Alerts shore contacts if you miss check-ins. Minutes-to-hours granularity, not seconds. |
Estimates assume a modern phone with a ~4,500 mAh battery in decent health, screen off, app in background. Real devices vary ±2×; treat as planning numbers and verify on your actual fleet of phones.
| Activity | Typical avg. current | % battery / day | Verdict |
|---|---|---|---|
| BLE connected, notify 1 Hz (screen off) | ~1–3 mA | ~1–2 % | Negligible |
| BLE advertise-only (alt. topology) | <1 mA | <1 % | Negligible |
| BLE continuous scanning (avoid on phone) | ~20–60 mA | ~10–30 % | Avoid |
| Wi-Fi associated, screen off, idle | ~15–40 mA | ~8–20 % | Costly |
| Wi-Fi UDP poll 1 Hz | ~20–50 mA | ~10–25 % | Too costly as primary |
| Wi-Fi UDP poll 0.2 Hz (fallback mode) | ~8–20 mA | ~4–10 % | Acceptable fallback |
| GPS 1 Hz continuous | ~25–50 mA | ~13–27 % | Skip — base has the track |
| Accelerometer 50–100 Hz, gated (only when outside) | ~2–8 mA | ~1–4 % | Fine when gated |
Your instinct (alarm at 3 s, maneuver at 6 s) is sound. Formalize it with retries and hysteresis so one lost packet never escalates, but three consecutive losses always do:
NORMAL ──heartbeat ≤1.2s──► NORMAL
│
└─ miss #1 ──► SUSPECT (base fires BLE ping requests, 5×/s)
│ reply received ──► NORMAL (log "glitch")
│ miss #2 ──► SUSPECT+ (ping faster, prep alarm)
│ │ reply ──► NORMAL
│ │ miss #3 (t≈3s) ──► ALARM
ALARM: sound horn + strobe, freeze datum, arm maneuver
│ t≈6s ──► MANEUVER: stop, reverse to datum, hold, expanding search
│
RECOVERED: requires PHYSICAL button at helm AND app confirm by that user
(prevents a stray tap from silencing a real emergency)
ZERO-G fast path: phone free-fall event ⇒ base immediately enters
SUSPECT+ for that user (even if heartbeats still arriving) — because
the next thing that happens to a fallen phone is submersion.
| Parameter | Suggested value | Rationale |
|---|---|---|
| Heartbeat period | 1 s | Fast detection; negligible battery (§6) |
| Alarm after | 3 consecutive misses (~3 s) | Tolerates 2 lost packets; still fast |
| Maneuver after | 6 s from first miss | ≈25 m run past datum at 8 kn — acceptable |
| Ping burst during suspect | 5 pings/s for up to 3 s | Distinguishes glitch from gone |
| Glitch hysteresis | Log, don’t alarm | Target <1 false alarm/month in service |
| Reset | Physical button + app confirm | No accidental resets; deliberate action |
| Nightly self-test | All phones, 21:00 | Catches dead batteries before bedtime |
| High-rate accel gating | Arms on door-open / exterior entry | Saves battery; zero-G only meaningful outside |
False-positive sources to engineer against: dropping a phone on deck (zero-G + impact — but heartbeat continues, so no alarm), jumping in deliberately for a swim (add a 60-second “swimming” mode toggle in the app), RF black spots behind masts/engines (map them; add a repeater dongle if needed), and microwave-oven bursts (BLE hopping shrugs these off).
| Base hardware | Cost | Fitness |
|---|---|---|
| Raspberry Pi 4/5 (built-in BLE) + USB BT dongle ×2 for diversity | $80–120 | Ideal — 24/7, GPIO relay for horn, CAN/NMEA hats available |
| Old laptop / Mac mini / mini-PC | $0 (already aboard) | Great — add a $10 USB BLE dongle; audio-out drives a siren |
| iPad/Android tablet | $0 | Partial — can run the app-side, weak as 24/7 server |
| Chartplotter / MFD | — | No — closed platforms; can’t host custom code |
The Java-ME-era pain (signed builds, obfuscation, device matrices, no Stack Overflow) is gone. Today: install Android Studio, ask Claude Code / Cursor / Copilot for a foreground-service BLE skeleton, and you have a working heartbeat demo in an afternoon. What remains genuinely hard is not typing code — it’s the last 20 %: background-execution quirks across OEMs, RF behavior at sea, and the discipline of on-water testing.
| Layer | Choice | Why |
|---|---|---|
| Android app | Kotlin, foreground service, android.bluetooth APIs | Most permissive background model; biggest installed base on boats |
| iOS app | Swift, bluetooth-central background mode + state restoration | Only reliable way to keep BLE alive on iOS |
| Cross-platform shortcut | Flutter + flutter_reactive_ble | Viable for MVP; expect to drop to native for background edge cases |
| Server | Python (asyncio + bleak) or Node (noble) on Raspberry Pi | AI tools generate this flawlessly; bleak handles multi-adapter diversity |
| Protocol | BLE GATT notify, 20-byte frames: ID ‖ seq ‖ flags ‖ HMAC | Simple, auditable, versionable |
| Alarm I/O | GPIO relay → 12 V horn + strobe; MQTT/LAN annunciation | Standard Pi fare |
| Debugging | nRF52 Sniffer dongle + Wireshark; Android btsnoop | You cannot fix what you can’t see on-air |
| # | Gotcha | Mitigation |
|---|---|---|
| 1 | Android Doze / App Standby suspends heartbeats | Foreground service + battery-optimization exemption + setup doctor |
| 2 | OEM task killers (Samsung/Xiaomi/Huawei) | Per-vendor setup screens; test matrix; “Don’t kill my app” catalog |
| 3 | iOS background limits | Bonded BLE + state restoration; iOS phones act as central |
| 4 | MAC randomization breaks crew identity | Bonding / payload IDs + HMAC; never trust addresses |
| 5 | Wi-Fi disassociates when screen off | BLE primary; Wi-Fi only as reduced-rate fallback |
| 6 | Continuous BLE scanning drains phones | Base scans; phone connects/advertises only |
| 7 | GPS on phone would dominate battery | Base owns positioning; phone GPS only post-alarm |
| 8 | Metal living-area walls shadow RF at doorways | Dual antennas + diversity; commission-time RF map |
| 9 | 2.4 GHz congestion (marina Wi-Fi, Starlink, microwaves) | BLE adaptive hopping; schedule defrost cycles 🙂 |
| 10 | Phone sinks → no homing signal | Floating waterproof pouch culture; BLE-tag fallback on PFDs |
| 11 | Dead phone = silent hole in the shield | Charge nags, morning red-list, optional door sensor (§ below) |
| 12 | False-alarm fatigue kills the system socially | Hysteresis + pings; log glitch rate; target <1 false alarm/month |
| 13 | Accidental reset silences a real event | Physical button + app double-confirm |
| 14 | Solo operator unconscious/unreachable | Fully autonomous stop-and-return; no human confirm needed to start |
| 15 | Swimmer mode forgotten ON | Auto-expire after 10 min; loud countdown; base annunciation |
| 16 | Alarm inaudible underway / asleep | Horn + strobe + deck floods + crew-phone push cascade |
| 17 | Overtrust: “we have an app, skip the EPIRB” | Explicit positioning as a complement; drills include PLB use |
| 18 | Un-tested code paths rot silently | Nightly self-test (base↔every phone), logged and reviewed |
| 19 | Two-seastead rafting confusion | Federated bases specified in protocol v1 |
| 20 | Privacy backlash from crew | Logs stay on-boat by default; opt-in cloud only |
Strategic upside: shipping this as a free open-source project before the first seastead exists builds the community, hardens the software on dozens of hulls, and creates goodwill no marketing budget could buy. It is also exactly the kind of project whose development (AI-assisted, commodity hardware, zero per-unit licensing) matches the seastead ethos.
Fatality figures in §2 are order-of-magnitude syntheses of the sources above; consult the latest annual reports for precise current numbers before publishing claims.