Convert OwnTracks Exports to GPX

Paste an OwnTracks JSON export or Recorder .rec log and get a standard GPX 1.1 track with timestamps, elevation, optional extensions, and segment splitting.

Try:
GPX track

Convert OwnTracks location history to standard GPX

OwnTracks is great for logging private location history, but many map and fitness tools expect GPX 1.1. This converter turns an OwnTracks export into one GPX track that you can import into map viewers, GPS editors, route archives, or GIS tools.

It accepts the common OwnTracks shapes:

Only location fixes are converted. Transition, waypoint, last-will, and other non-track messages are skipped. Every output point becomes a GPX <trkpt lat="..." lon="..."> with <time> from tst (Unix seconds) and <ele> from alt when present. With Include OwnTracks extensions enabled, accuracy, velocity, course, battery, and tracker id are preserved under a small ot: extension namespace.

Worked example

Input JSON:

[
  {"_type":"location","tid":"5f","lat":52.1,"lon":5.1,"alt":10,"acc":12,"tst":1704110400},
  {"_type":"location","tid":"5f","lat":52.101,"lon":5.102,"alt":12,"acc":8,"tst":1704110700}
]

Output excerpt:

<trk>
  <name>Morning walk</name>
  <trkseg>
    <trkpt lat="52.1" lon="5.1">
      <ele>10</ele>
      <time>2024-01-01T12:00:00Z</time>
      <extensions>
        <ot:accuracy>12</ot:accuracy>
        <ot:tid>5f</ot:tid>
      </extensions>
    </trkpt>
  </trkseg>
</trk>

Options

Limits and edge cases

FAQ

What OwnTracks export formats does this accept?

It accepts JSON arrays of location messages, Recorder API wrappers with a data array, single location objects, newline-delimited JSON objects, and Recorder .rec lines where the JSON payload appears after the timestamp/type columns.

Why are some records missing from the GPX?

Only _type="location" messages become track points. OwnTracks also stores transition, waypoint, and status messages, which are not GPS fixes. Records without latitude/longitude are skipped, and the accuracy filter can remove imprecise fixes.

Should I include OwnTracks extensions?

Leave them on when you want to preserve accuracy, speed, course, battery, and tracker id. Turn them off if the target importer only accepts plain GPX elements and rejects custom extension namespaces.

How does segment splitting work?

Set a gap threshold in minutes. If consecutive fixes are farther apart than that threshold, the converter starts a new <trkseg>. A value of 0 keeps all points in one continuous segment.

Is my location data uploaded?

No. Parsing and GPX generation run locally in the browser through WebAssembly. There is no network call and no server-side processing.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool owntracks-to-gpx '[{"_type":"location","lat":52.1,"lon":5.1,"tst":1704110400,"alt":10,"acc":12}]'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/owntracks-to-gpx/?input=%5B%7B%22_type%22%3A%22location%22%2C%22lat%22%3A52.1%2C%22lon%22%3A5.1%2C%22tst%22%3A1704110400%2C%22alt%22%3A10%2C%22acc%22%3A12%7D%5D&track_name=Sunday%20hike&include_extensions=true&segment_gap_minutes=0&max_accuracy_meters=0

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.