Open the map and everyone is there, each with how old their location is. A location from 40 minutes ago looks 40 minutes old. I'd rather see that than a pin that pretends.
Phones send locations in batches to save battery. Open the map and they send a fresh one. Tap someone and you follow them live.
You decide who sees what
Share all the time with your family, and only when you choose with another group. Pause whenever you like.
Send a grandparent a link that expires. Parental controls let you manage a child's settings for them.
Places and arrivals
Name the places that matter: home, school, work. Pick the ones you want to hear about and ignore the rest.
Tell your family where you're heading and they get an ETA. Or hear only when something is off, like your daughter not being at school by 8:15.
Safety
Crash detection watches while you drive and alerts the people you picked. SOS takes a two-second hold on your phone, the web, or a watch.
Going somewhere you don't feel safe? Start a check-in timer. The countdown runs on the server, so your people hear about it even if your phone is dead or gone.
You also hear when someone's battery runs low or their phone stops reporting.
History
Years of where you've been, as a timeline of places and trips. It tells a drive from a bus, a train, or a flight, names the places you stopped, and shows your commutes.
It's your data, so it moves. Bring in a Google Timeline export, GPX, or GeoJSON, and export any stretch back out.
Activities and watches
Record a run, a ride, or any of 14 sports from your phone or your watch: Wear OS, Apple Watch, Garmin, Pebble, or Amazfit.
You get the route, splits, heart rate zones, goals, and personal records.
And also
Find your other phones and GPS trackers you've added.
Save map areas for places without signal.
Forward your own locations to Home Assistant or OwnTracks.
One phone can use several servers.
The driving report counts speeding, hard braking, and phone use on each trip.
Your server, your data
How it runs
One Go binary. It keeps its data in SQLite, PostgreSQL, or MySQL.
It draws its own maps from OpenStreetMap data it downloads, so your phones never tell a tile provider where you are. Alerts go out as encrypted Web Push.
The web UI is Svelte and MapLibre. The Android and iOS apps share their code in Kotlin Multiplatform, and there is a desktop app for macOS, Windows, and Linux.
REST API
WebSockets for live updates
MCP endpoint for AI agents
Prometheus metrics
Quickstart
Run your own server
You need Docker and an address your family's phones can reach. This runs Kehai with PostgreSQL, which is the setup to keep. Change each highlighted value to your own.
Your email. The server sends it with its requests to the OpenStreetMap services, so they can reach you. It won't start without one.
a long random password
The database's password. Letters and digits only. openssl rand -hex 24 makes one.
3. Start it and create your account
docker compose up -d
docker compose exec kehai kehai user create you 'a long password' \
--admin --display-name 'Your Name'
you
The username you will sign in with.
a long password
Your password. Keep the quotes around it.
Your Name
The name your family sees on the map.
4. Sign in
Open the server's address in a browser, sign in, create a group, and invite your family.
Everything is kept in the data folder beside the two files: the database, and the server's config with its keys. Back up that folder. The image is grmrgecko/kehai on Docker Hub and ghcr.io/grmrgecko/kehai on GitHub.
Where it runs
Platforms
Server
Linux, macOS, Docker
Phones and web
Web. Android. iPhone and iPad.
Desktop
macOS, Windows, and Linux
Watches
Wear OS, Apple Watch, Garmin, Pebble, Amazfit
気配
The name
Kehai comes from the Japanese 気配, the sense that someone is there even when you can't see them. That is what I wanted the app to give. My wife can drive to work knowing that if something goes wrong, I can find her and help.
You shouldn't have to keep checking a map, either. Kehai stays quiet in the background and speaks up when something happens: someone got home, a child isn't at school yet, a car crashed, a phone went dead.