Inspiration
My roommate pointed it out casually one night: "if something happened to you
in your apartment, how long before anyone noticed?" I didn't have a good answer.
Neither did he. Neither do the 36 million Americans who live alone.
Every existing solution feels designed for someone's grandmother — clinical, subscription-based, AARP-coded. We wanted something a 25-year-old in their first apartment would actually use. Dark name. Clean UX. No drama.
## What It Does
One tap a day says Still Here. Not tapping fires the chain:
- Push notification + email with a check-in link
- Grace period (configurable — camping? set it to 10 days)
- SMS to emergency contacts with a one-click confirm link
- Automated wellness check request to local non-emergency services
That's it. The whole product is a single daily ritual.
## How We Built It
- Backend: FastAPI + Celery + Redis for the escalation timer queue
- Database: Raw SQL via SQLAlchemy
text()on Supabase Postgres — no ORM - SMS/Voice: Twilio for outbound escalation and non-emergency calls
- Email: Resend for check-in links and contact notifications
- Scheduling: Celery Beat polls every minute, matching users whose
- Frontend: Vanilla JS PWA — installs like an app, no App Store
- Auth: JWT (HS256) + optional Auth0 + API key support for IoT integrations
- Deploy: Docker Compose on a VPS behind Caddy
The scheduling logic is intentionally simple. Every user stores a checkin_time
in UTC. One global beat task fires every 60 seconds and checks:
$$t_{\text{fire}} = \lfloor t_{\text{UTC}} \rfloor_{\text{minute}} =
t_{\text{checkin}}$$
A checkin_fires table guards against double-triggering within the same window.
## Challenges
Twilio wasn't approved in time. Toll-free verification was rejected 48 hours
before the deadline — wrong email domain, consent language bundled into ToS. We
pivoted to AWS SNS for the demo overnight. SNS has no inbound webhook, so we
replaced reply-based confirmation with one-time signed token links. Actually
cleaner. Sometimes the constraint produces the better design.
Per-user scheduling without django-celery-beat. Dynamic crontabs add a whole
database-backed scheduler dependency. The single polling task keeps the
architecture dead simple and scales fine until you have tens of thousands of
users.
The 911 problem. 911 has no API. Text-to-911 exists in most US counties but
is carrier-routed with no programmatic access. For now we call the local
non-emergency line via Twilio voice. Long-term: B2B wellness check partnership
or an AI voice agent.
## What We Learned
Scope aggressively. The signed-link confirmation flow was better than the
original reply-based design — simpler, more reliable, works across every carrier
environment.
Also: a subscription to an app called Still Here would be genuinely evil.
One-time purchase only.
Website: https://stillherehq.com/ Github: https://github.com/xyzmr114/stillhere
Built With
- aws-sns
- celery
- docker
- fastapi
- firebase-fcm
- python
- redis
- sqlalchemy
- supabase
- vanilla-js

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