Inspiration

Every night out ends with the same text: "get home safe?" But the moments that matter most are the ones where nobody can send that text. A spiked drink, too much to drink, a phone that died, someone who won't leave you alone. Every safety app we looked at has the same blind spot: it needs you to press a button. We wanted something that helps exactly when you're no longer in a position to ask for help yourself.

So we built a dead man's switch for a night out. Help starts when you stop answering, not when you manage to call for it.

What it does

Tenshi watches over you on a night out, and does nothing at all as long as you're fine.

  • Check-ins on a timer. Your phone asks "Still good?" One tap (or a touch on the necklace) says you're fine. Check-ins come sooner when replies get slow, the battery runs low, or it's late.
  • An escalation ladder that runs on the server. No answer → your phone sounds an alarm → still nothing → your trusted friend gets your last known location and a plain-English summary of your night → if they don't confirm, a backup contact gets it too. Because the timer lives on our server, a dead phone can't stop it. Only your PIN can.
  • It hears distress, in about a second. If you can't reach anything at all, your phone listens for distress. A shouted "help" or "get away from me" alerts your friend about a second after the shout starts, often before the sentence is finished, and shows them exactly what was heard. Normal conversation ("can you stop by the store?") doesn't trigger it, and swearing only counts when it's shouted.
  • The necklace. A wearable "Switch" (Arduino Uno R4 WiFi) with a touch sensor to check in without unlocking your phone, a buzzer and LED that keep signalling even if your phone dies, an LED matrix showing the countdown, and a barometer that flags cold exposure on the walk home.
  • Your week, as data. Every night becomes a time series you can look back on: how late, how loud, how fast you answered, how much battery you had left, how cold the walk home was. All of it is in Grafana dashboards built on Tiger Data.
  • Private by design. Audio is never stored. On a real night, a short clip only leaves your phone after a scream-level spike, gets checked in memory and is wiped. Your friend sees what was heard, never a recording. Location history deletes itself after 7 days.

How we built it

Vultr: every model self-hosted, no public AI APIs. Tenshi handles some of the most sensitive data there is: where you are at 2 AM and what your phone hears when you're in trouble. So none of it goes to OpenAI, Google or any public AI API. Everything runs on our own Vultr server in Toronto, one Docker Compose stack:

  • Node.js / Express app with the escalation timer. A dead man's switch needs an always-on server, which serverless can't give you.
  • Vosk (Kaldi) streaming speech recognition for live keyword spotting: words come back about 10 ms behind live audio.
  • Whisper (faster-whisper) to check the clip after a scream on a real night.
  • Llama 3.2 3B via Ollama to write the contact's plain-English summary. It's instructed never to guess at causes or substances, only to say "hasn't responded".
  • Caddy for HTTPS, plus Grafana.

Tiger Data: a night out is time-series data. Every heartbeat (location, battery, sound level, movement) is a row in Tiger Cloud:

  • events and metrics are hypertables, with compression after 1 day.
  • A retention policy deletes location and events after 7 days, so privacy is enforced by the database itself.
  • Continuous aggregates (metrics_1m, heartbeat_1m) roll data up by the minute, so a whole week of nights loads instantly and powers the contact's signal trace.
  • Anomaly detection runs in SQL: a rolling z-score over window functions flags unusual sound for that night.
  • Two Grafana dashboards (one live night, one week) query Tiger directly.

Hardware. Arduino Uno R4 WiFi on a Grove shield: touch sensor, buzzer, LED, DPS310 barometer and the built-in LED matrix. Our own firmware talks to the server over WiFi or through a USB bridge, and samples touch inside every network wait so a quick tap is never missed. The necklace design is also an interactive three.js 3D render you can flip to see where each sensor sits.

Frontend. Plain HTML, precompiled Tailwind and vanilla JS. A live "stage" shows the friend's phone and yours side by side, with a strip showing each word as it's recognized and every row landing in Tiger Data.

Challenges we ran into

  • Speed versus accuracy for "help". Our first version transcribed each full sentence with Whisper, which meant waiting for the speaker to stop talking: 4–9 seconds to an alert. We switched the live path to streaming keyword spotting with Vosk, which recognizes words while you're still talking, and got it to about a second.
  • False alarms. Live captions caught "can you **stop* by the store"*. We rewrote the distress phrases for unpunctuated streaming text: unambiguous phrases ("get off me", "somebody help") fire mid-sentence, single words like "stop" only count when the utterance ends on them, and swearing has to be shouted.
  • A bug that only showed up in production. On the live server, the phone's room-noise level arrived while the server was still looking up the night in the cloud database, so it was dropped and normal speech counted as a shout. It was invisible locally because the local store answers instantly. The fix was to attach every listener before doing anything asynchronous.
  • Tiger Cloud over TLS from Node. node-postgres treats sslmode=require as full certificate verification, which rejected the connection. We switched to libpq semantics, which still encrypt.
  • Hardware at a hackathon. Flaky USB ports, a board stuck in its bootloader until power-cycled, and a touch sensor that missed taps while the board waited on the network. We also cut NFC late, when the part wasn't pulling its weight.

Accomplishments that we're proud of

  • A shouted plea for help alerts your friend about a second after the shout starts. In our tests, that was before the sentence was even finished.
  • Zero public AI APIs. Speech recognition, transcription and summaries all run on our own Vultr server.
  • Privacy enforced by the database, not just promised: Tiger Data retention deletes location history on schedule, and audio is never written anywhere.
  • Real hardware, working end to end with the live site: touch the necklace and the check-in lands in Tiger Data.
  • An escalation ladder that keeps going even when the phone is dead.

What we learned

  • Latency is a product feature. For safety, "accurate in 9 seconds" loses to "good enough in 1 second, confirmed after".
  • Streaming changes everything about text matching. No punctuation, no sentence boundaries: you have to decide what's safe to act on mid-utterance.
  • Time-series databases fit this domain. Hypertables, continuous aggregates and retention policies turned "privacy" and "fast dashboards" into a few lines of SQL.
  • Self-hosting AI is practical now. A 3B-parameter Llama, Whisper and Kaldi all run side by side on one CPU server.

What's next for Tenshi

  • A battery-powered necklace with its own WiFi or LTE, so it works with no laptop or phone nearby, plus HTTPS from the device.
  • Smarter, personal baselines: learning each person's normal nights so anomaly detection flags what's unusual for them.
  • Fall and impact detection from motion sensors, and a long-press panic gesture on the necklace.
  • Venue and campus partnerships, so safe-ride and security teams can be the backup contact.

Try it: [INSERT DOMAIN]

Built With

Share this project:

Updates

Submission history