-
-
3d printing plate
-
Visual demo of model training on website
-
Activity log and settings for example device
-
Landing page animation with StillHere diagram
-
Healthcare provider dashboard with all statuses shown
-
StillHere mounted on drawer door
-
StillHere circuit in prototyping without casing
-
CAD
-
Assembled CAD
Inspiration
We've worked in old age homes, and we've seen how much of care comes down to someone simply noticing. It's also personal. My grandmother died of cardiac arrest, and no one noticed until hours later. Those hours are what StillHere is about.
The tools that exist today mostly fall into two camps. Some are wearable panic buttons, which only help if the person is wearing one and can press it. Others are camera systems, which feel invasive and cost more than most families can spend. We wanted something affordable and unintrusive that people could stick on the things they already use every day and then forget about. Safety shouldn't be exclusive.
What it does
StillHere is a small sensor that sits on an everyday object like the fridge, a walker, or the front door. It watches for three things:
- Falls: a hard jolt paired with a loud sound
- Loud noises: a crash or a shout
- Broken routines: a quiet stretch that's unusual for this particular person
When it hears or feels something wrong, the board beeps and lights up to ask "Are you okay?" A single button press says "I'm fine." If nobody answers within the reply window, StillHere texts family, with email as a backup. Holding the other button sends a call for help right away.
The part we're proudest of is that it learns each person's day. StillHere models how likely activity is at every hour, based on the last four weeks. Someone who always opens the fridge around 8 AM gets checked on when breakfast never happens, while someone who sleeps in doesn't get false alarms. There are no cameras, no microphone recordings, and nothing to wear.
For senior living communities, there's a staff dashboard as well. It shows a live grid of every apartment colored by time since the last movement, pages the on-call phone first for urgent alerts and escalates if nobody acknowledges them, gives a gentle "activity lower than usual" flag for wellness visits, and tightens its watch during National Weather Service heat or cold advisories, when older adults living alone are most at risk.
How we built it
Hardware. A Circuit Playground Express (CPX) handles sensing with its accelerometer and microphone. It's wired over UART to a Raspberry Pi Pico W, which provides Wi-Fi. Everything fits in a custom 3D-printed case, powered by a battery pack we salvaged.
Firmware. The CPX runs CircuitPython. It detects motion, loud sounds, and falls (a jolt and a noise within the same one-second window), runs the "Are you okay?" beep, and reads the buttons. It sends small JSON frames over serial to the Pico W, which runs MicroPython and posts them to our API over HTTPS. The Pico keeps a small priority queue so that a fall or a help request always jumps ahead of routine motion, retries alarms once, and drops stale events rather than replaying them late. It also relays over-the-air updates, so we could flash new CPX code over Wi-Fi without unplugging anything.
Backend. FastAPI with SQLModel on SQLite, plus an APScheduler loop that checks every device. The alert state machine goes from ok to awaiting reply to alert to all clear. Textbelt sends the texts and Resend sends the emails. It's deployed on Railway in a single Docker image that also serves the website.
The learned routine. We treat a person's activity as a Poisson process whose rate $\lambda(h)$ depends on the hour of day $h$. That rate is fit with Bayesian Gamma-Poisson estimates, with recent days weighted more heavily (a 7-day half-life) and smoothed across neighboring hours. For a quiet stretch from the last movement $t_0$ to now $t$, the chance of seeing no activity at all is
$$P(\text{silence}) = \exp\left(-\int_{t_0}^{t} \lambda\big(h(s)\big)\,ds\right)$$
and StillHere raises an alert when that probability drops below 5%. Because the model scores the whole stretch and not just the current hour, a normal night stays quiet, but a missed breakfast stands out.
Frontend. React, TypeScript, Vite, and Tailwind, with Recharts for activity charts. The landing page renders our actual CAD model in raw WebGL with custom shaders. As you scroll, the sensor lifts, turns, and explodes into its parts so you can see what's inside.
Challenges we ran into
- Hardware limits. We wanted a Circuit Playground with built-in Wi-Fi, but the CPX has none, so we wired it to a Pico W. The CPX has only 32 KB of RAM, so we compiled our code to bytecode with mpy-cross and optimized hard to avoid running out of memory and overflowing the serial buffer. Our over-the-air updates only became reliable once we sent data in 64-byte chunks.
- Power. The battery packs at the hardware desk held 2 or 4 batteries. They were all too bulky and the wrong voltage. So we took apart a free handheld fan from Meta and used its compact battery pack to power our prototype.
- Networking. The Pico W couldn't reach our server from behind eduroam, so we ran the device on a phone hotspot.
- Choppy animations. The first version of the landing animation stuttered. We packed the 3D model into a compact binary format to send less data to the GPU, and we tied the animation directly to scroll position so each bit of scrolling moves the model by a constant amount.
- Blocked services. Railway blocks SMTP, so we moved email to Resend. For SMS, we started with Twilio and then tried SimpleTexting, but both needed account approval that takes business days, which a hackathon doesn't have. We switched to Textbelt.
- One 3D print. We were only allowed one print, and its inner dimensions came out slightly off, so we physically modified the case to make the wiring fit.
Accomplishments that we're proud of
- For every one of us, this was our first hackathon, and none of us had much hardware experience. We still shipped a working hardware product that detects falls and loud sounds on a real board and texts a real phone from a live server.
- The landing page animation, which opens up a mini 3D model of StillHere to show what's inside.
- A routine model that learns each person's day and explains its alerts, rather than relying on one fixed timer for everyone.
What we learned
- A lot about firmware and low-level programming, and how the CPX and the Pico W work and talk to each other.
- How to adapt to constraints and to the materials we had, from salvaged batteries to a single 3D print.
- How to build efficiently under intense time pressure, splitting the work cleanly across hardware, backend, and frontend.
- How big and specific this problem is, and how quickly a real solution can come together.
What's next for StillHere
- A real prototype. A single board with built-in Wi-Fi, a smaller case, and a proper battery, without the hackathon's hardware limits.
- Testing with real people. Pilots with families and market validation.
- Senior living communities. Health centers already have to monitor their residents, and StillHere gives their healthcare staff the dashboard and tools to do it.
- Scalable software. Moving from SQLite to PostgreSQL and building foundations that can support many communities.
Built With
- 3d-printing
- apscheduler
- autodesk-fusion-360
- circuit-playground-express
- circuitpython
- docker
- fastapi
- micropython
- national-weather-service-api
- open-meteo
- python
- railway
- raspberry-pi-pico-w
- react
- react-router
- recharts
- resend
- sqlite
- sqlmodel
- tailwindcss
- textbelt
- typescript
- uart
- vite
- webgl
Log in or sign up for Devpost to join the conversation.