Check on Mine
A cross-platform safety and wellness monitoring platform for families and the people who care for them. Built solo, end-to-end.
checkonmine.com →What it is
Check on Mine is the safety net I wanted for the older people in my life and never found in the App Store. It lives on the user's phone (native iOS and native Android) with a macOS menu-bar companion for caregivers and family who want a glanceable view from their desk. It runs scheduled wellness check-ins, watches for falls and anomalies, lets the user fire an SOS, tracks medication adherence, monitors trips in real time, sends severe-weather alerts, and escalates through a tiered response chain if a user doesn't respond when something looks wrong.
It is built for elderly users first, and for everyone who loves them second. Every UI decision is filtered through “would my grandmother understand this without help.”
Feature surface
10-second SOS
One tap. Ten seconds to cancel. Otherwise it calls every contact in the response chain, with location, in priority order, until someone picks up.
Trip mode
Live location streaming to family during a drive, walk, or commute. Auto-stops on arrival. Includes a beat-the-ETA timer that escalates if it expires.
Medication adherence
Per-medication schedule with snooze, taken-late, and missed states. Family sees a glanceable timeline. Optional escalation if a critical dose is missed.
Wellness check-ins
Configurable schedule asks the user "how are you feeling?" with tiered escalation if they don't respond — ping, text, call, contact next-in-chain.
Geofenced safe zones
Define home, family, doctor, friend's house, church — the system notices when something is out of pattern. Quiet by default; loud when it matters.
Severe weather alerts
NWS feed monitored per user's location. Wind, tornado, flood, hurricane warnings push immediately with the protective action.
Activity anomaly detection
The app learns the user's normal motion profile. A sustained deviation — long stillness during what should be active hours, for example — raises a discreet flag for the family.
macOS companion
Menu-bar app for the family member or caregiver who keeps a Mac at their desk. Status at a glance; one click for the full view.
Architecture
Clients
Native iOS in SwiftUI. Native Android in Kotlin with Jetpack Compose. macOS companion as a SwiftUI menu-bar app sharing the same data layer as the iOS app. All three talk to the same serverless backend with the same in-house JWT auth.
Backend
Serverless PHP on AWS Lambda via Bref. Multi-tenant DynamoDB schema (per-user partition keys with overloaded sort keys for activities, contacts, check-ins, medications, geofences, weather subscriptions). API Gateway in front; SES for transactional mail; SNS / End User Messaging for SMS; APNs and FCM for push.
Auth
In-house JWT, migrated from AWS Cognito after the original Cognito design ran into per-user-pool limits and a UX I couldn't tune. The replacement is a simple signed-token issuer + refresh-rotating client, with revocation lists living in DynamoDB. Smaller, faster, and easier to debug.
Escalation engine
The heart of the system. Every event (missed check-in, missed medication, anomaly flag, SOS, weather alert, ETA expiration) flows through the same escalation pipeline. It owns the contact chain, the timing, the channel selection (push first, then SMS, then voice), and the “quiet hours” rules. One place to reason about “when do we wake somebody up.”
Severe-weather subsystem
Per-user location subscriptions check the NWS forecast on a regular schedule. When an active warning lands inside a user's polygon, the system pushes immediately with the protective action and tells the family. The same engine drives weather-aware adjustments to other subsystems — we don't fire a "you didn't check in this morning" escalation if the user is in a tornado-warning area, because that's noise on top of an emergency.
Selected design decisions
- Native everywhere, not React Native. Background location, CallKit, CoreLocation regions, the macOS menu-bar — the platform integrations are where the value is. RN would have made the simple things faster and the important things impossible.
- Single-table DynamoDB instead of relational. Per-user partitioning means every read is O(1) on hash. We pay in query rigidity, and we get scale + cost back. For an app where one user's data never touches another's, the tradeoff is correct.
- Bref over plain Lambda. PHP-FPM via Bref gave me a familiar runtime model and a fast iteration loop. The runtime cost is dominated by cold starts, which I solved with provisioned concurrency on the critical paths.
- Escalation is the only abstraction worth keeping. Everything else — SOS, missed check-in, weather alert, ETA expired — ultimately produces an event that the escalation engine consumes. Centralizing that gave me one place to fix incidents instead of fixing them in five.
- Quiet by default; loud when it matters. The product's job is to disappear most of the time. Notification volume is the metric I optimize against.
Where it goes next
- SafeWorker. The same core, repackaged for B2B lone-worker safety in oil & gas, utilities, and construction. Multi-tenant orgs, supervisor dashboards, shift-based check-ins, compliance reporting. Same backend, different surfacing.
- Watch-side automation. Apple Watch / Wear OS complications and the Action Button as a one-tap SOS surface. In progress.
- Family-tier subscription. Multi-user shared plans for households with more than one person to monitor.