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.

Download on the App Store View on GitHub

The Overland tracker screen, showing queued points and the send interval
Track now, send later in batches
The Overland settings screen with tracking and accuracy options
Highly configurable tracking
The trip mode picker, with walk, run, bike, car, train and more
Log walks, rides, drives and train trips

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.

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.