A child-safety mobile app: live location, geofence alerts, SOS, screen-time tracking, and a direct line between parent and child.
Built with Expo / React Native on the front and Express + MongoDB behind it, with Socket.IO carrying anything that needs to arrive now.
| Live location | Parents see their child's current position and movement history on a native map (react-native-maps) |
| Geofencing | Define safe zones; entering or leaving one fires a push notification. Runs via expo-task-manager so it keeps working in the background |
| SOS alerts | One tap from the child sends an immediate alert to every linked guardian |
| Screen-time tracking | Device usage charted over time so parents can see patterns rather than just totals |
| Real-time chat | Parent ↔ child messaging over Socket.IO |
| Secure auth | Clerk handles sign-up, login and session management; tokens live in expo-secure-store, not AsyncStorage |
| Cross-platform | iOS, Android and web from one Expo Router codebase |
Mobile client
- Expo SDK 52 + Expo Router 4 (file-based routing)
- React Native 0.76, TypeScript
- NativeWind (Tailwind syntax for React Native)
expo-location+expo-task-manager— background location and geofencingexpo-notifications— pushreact-native-maps— map renderingreact-native-chart-kit— screen-time charts@clerk/clerk-expo— authsocket.io-client— real-time transport
Server
- Node.js + Express, written in TypeScript
- MongoDB via Mongoose
- Socket.IO for location broadcasts and chat
- Svix for webhook verification (Clerk user sync)
- Swagger (
swagger-jsdoc+swagger-ui-express) at/api-docs
mokidsafe/
├── client/ # Expo / React Native app
└── server/ # Express + Socket.IO API (TypeScript)
Prerequisites: Node.js 18+, the Expo CLI, a MongoDB database, and a Clerk application.
git clone https://github.com/vincedotcode/mokidsafe.git
cd mokidsafeServer
cd server
npm install
cp .env.example .env
npm run devMONGODB_URI=
PORT=3000
CLERK_WEBHOOK_SECRET=Client
cd ../client
npm install
npm startScan the QR code with Expo Go, or press i / a for a simulator. Note that background location and geofencing need a physical device — they do not behave correctly in a simulator.
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=
EXPO_PUBLIC_API_URL=Background location is the hard part of this app, not the maps. iOS and Android both treat "always allow" as a privileged permission with its own prompt flow, and both will silently downgrade it if the user isn't asked in the right order. The permission sequencing in client/ is deliberate — changing its order will break geofencing on real devices while still appearing to work in Expo Go.
MoKidSafe is a supplementary awareness tool for guardians. It is not a substitute for supervision, and it should not be relied on as a sole safety measure.
MIT — see LICENSE.
Vince Erkadoo — vincedotcode.com · vince@vincedotcode.com