Track your location, send it to your own server
Overland is an open source GPS tracker for iPhone. It logs your location in the background and sends it to a server of your choosing. It keeps saving data while you're offline and sends it later in batches.
Features
-
Works offline
Location points are queued on the phone and sent to your server in batches, so nothing is lost when you lose signal.
-
Detail or battery life
Get highly detailed track logs and use more battery, or track only significant movements to save battery. Every CoreLocation setting is exposed for you to tune.
-
Trips
Start and stop a trip to record a bike ride, run, walk, car trip, train trip and more. The trip is sent to your server along with its location points.
-
Bring your own server
The app posts GeoJSON to any HTTP endpoint. Use one of the compatible servers or build your own.
-
Remote configuration
Set up the app with an
overland://link, or have your server change the app's settings in its response. -
Open source
The app is Apache 2.0 licensed. You can read, build and modify the source code on GitHub.
How does it work?
Overland uses the iOS CoreLocation API to collect location data from the phone. iOS places a lot of limits on location data, and the app does the best it can to keep running in the background as long as possible.
Because of how iOS handles location and backgrounding, you can't set the app to collect and send data at a fixed interval. The best you can do is "suggest" what you want from the phone, and take what you get. For example, you can ask for one point every 100 meters, and sometimes you'll get more, sometimes less.
You can read more about the available settings in the README.
Compatible apps
Overland's API is simple enough that other developers have built apps that send data the same way. Any of these will work with the servers below.
-
iOS
Overland for iOS
The original Overland app for iPhone, from the developer of this site.
-
Android
Colota
A GPS location tracker for Android that can send data in the Overland format, as well as to Dawarich, OwnTracks, Traccar, Home Assistant and custom backends.
-
Android
Overland for Android
An Overland-compatible GPS logger for Android. It's a Kotlin remake of the deprecated OpenHumans Overland Android app.
Built another app that speaks the Overland API? Let me know and I can list it here.
Servers
The app sends data to an HTTP endpoint of a server of your choosing. You can use an existing backend or build your own. These work with Overland out of the box:
-
Compass
A self-hosted PHP app built to save and review data from this app.
-
Wayfinder
A self-hosted app for Overland.
-
Dawarich
A self-hosted alternative to Google Location History.
-
PureTrack
A service for tracking lightweight planes and gliders.
-
Open Humans
A service for tracking your data and sharing it for research purposes.
-
Icecondor
A service for tracking your location, sharing with friends, and setting geofence alerts.
-
Home Assistant
A home automation platform. Overland can send data in the OwnTracks format that Home Assistant supports. See setup instructions.
If you've written a backend that others can use, either hosted as a service or something they can install, please let me know and I can list it here!
API
Once you add a server endpoint in the settings, the app will begin sending you data. Each request is a JSON POST body with a list of GeoJSON points in a locations key:
{
"locations": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-122.030581, 37.331800
]
},
"properties": {
"timestamp": "2015-10-01T08:00:00-0700",
"altitude": 0,
"speed": 4,
"horizontal_accuracy": 30,
"vertical_accuracy": -1,
"motion": ["driving","stationary"],
"pauses": false,
"activity": "other_navigation",
"desired_accuracy": 100,
"deferred": 1000,
"significant_change": "disabled",
"locations_in_payload": 1,
"device_id": "",
"wifi": "launchpad",
"battery_state": "charging",
"battery_level": 0.89
}
}
]
}
Your server replies with {"result":"ok"} to confirm it received the data. Please see the README for full details on the request, the response, and the rest of the API.









