Apexlog User Manual

日本語 · Home · Privacy Policy

Apexlog records GPS + motion telemetry while you ride or drive, and lets you replay and analyze it. This manual covers how to use the app and — importantly — the open NDJSON data format so you can analyze your exported recordings yourself.


Recording

  1. Mount your phone (or pocket it) and open Apexlog.
  2. Tap Record. The status panel shows elapsed time, sample count, current speed and current G.
  3. Tap Stop to finish. The run is saved automatically as an .ndjson file.

Each recording captures, from the moment you start (rates are the defaults — see Recording modes below):

Recording modes: Sport vs Travel

Open Settings (gear icon) → Recording to pick a mode:

Travel mode and Pro: travel logging is free, but keeping it running with the screen locked or the phone pocketed needs background recording (Pro). Without Pro the app warns you when you start: recording will stop as soon as the screen locks.

Foreground vs background


Your recordings (library)

The home screen lists your recordings, newest first, with file size and start time. Tap one to open playback.

Delete a recording with the trash icon. Deleting is permanent.


Playback & analysis

Opening a recording shows, top to bottom:

Use the timeline slider to scrub, the play button to animate, and the speed menu (0.5×–8×) to change playback rate. Lean, pitch and heading are computed by fusing the accelerometer, gyroscope and GPS (a complementary filter), after a device→vehicle calibration derived from the ride itself.

Travel recordings (no IMU) replace the vehicle gauge with a journey gauge: an activity icon that follows your speed, plus a trip odometer (distance covered so far). On foot logs show Break ☕ / Walking 🚶 / Road 🚌 / Train 🚆 / Flight ✈️; Vehicle logs show Stop 🚦 (standing ≤1 min — lights, queues) / Break ☕ (parked longer) / Local road 🚗 (<60 km/h) / Highway 🏎 (faster). The map, speed chart and readouts work as usual.

The on-device analysis uses a calibration that aligns the phone’s arbitrary mounting orientation to the vehicle’s axes. The raw log stores device-frame sensor data — see below if you want to reproduce the vehicle-frame math yourself.


Exporting

Export/share is a Pro feature. Each recording row has an export button and a ⋮ menu with three ways out:

Opening your track in Google Maps / Earth

On a Mac/PC you can also copy the files directly off the device over USB (they live in the app’s Documents directory).


Data format reference

Recordings are UTF-8 NDJSON (newline-delimited JSON): one JSON object per line, one sample per line. The format is open and trivial to parse in any language.

File

apexlog-YYYYMMDD-HHMMSS.ndjson

Named from the local wall-clock start time, e.g. apexlog-20260615-181241.ndjson.

meta line (first line only)

{"type":"meta","app":"apexlog","ver":"0.2.1","startedAt":"2026-06-15T18:12:41.463902+09:00","device":"iPhone16,2","hz":{"imu":100,"gps":1},"mode":"sport"}
Key Meaning
type Constant "meta"
app Constant "apexlog"
ver Log-format / app version (e.g. "0.2.1")
startedAt Recording start wall-clock, ISO 8601 with local UTC offset
device Device model (e.g. "iPhone16,2", "Pixel 8"; "unknown" if unavailable)
hz Requested sampling rates (configured, not measured). imu is 0 when the IMU was disabled (travel mode / IMU Off) — such logs contain no imu lines. gps is the nominal rate of the chosen tier; 0 means sub-Hz (distance-driven travel presets)
mode (0.2.1+, optional) "sport" or "travel". Absent in older logs
preset (0.2.1+, optional) Travel preset: "onFoot" or "vehicle"

Sample lines

Every sample line carries:

Key Meaning Unit
t Seconds since recording start (monotonic clock) s
s Stream: "gps" or "imu"

gps line:

{"t":1.000,"s":"gps","lat":35.681236,"lon":139.767125,"alt":3.2,"spd":12.5,"hdg":270.1,"acc":4.0}
Key Meaning Unit
lat / lon Latitude / longitude deg
alt Altitude m
spd Speed m/s
hdg Heading (course over ground); negative = unavailable (e.g. at standstill) deg
acc Horizontal position accuracy m

imu lines. The three IMU sensors arrive as independent stream events at different instants, so each is written on its own line containing only that sensor’s axes (other fields omitted). A line is one of:

{"t":0.010,"s":"imu","ax":0.12,"ay":-0.03,"az":9.79}
{"t":0.011,"s":"imu","lax":0.05,"lay":-0.01,"laz":0.02}
{"t":0.010,"s":"imu","gx":0.001,"gy":0.000,"gz":-0.002}
Keys Meaning Unit
ax / ay / az Raw accelerometer (gravity included) m/s²
lax / lay / laz User acceleration (gravity removed) m/s²
gx / gy / gz Gyroscope (angular velocity) rad/s

Notes:


Analyzing your data

A minimal Python example — load a recording, separate the streams, and compute total G and speed in km/h:

import json, math

meta = None
gps, accel, uaccel, gyro = [], [], [], []

with open("apexlog-20260615-181241.ndjson") as f:
    for line in f:
        o = json.loads(line)
        if o.get("type") == "meta":
            meta = o; continue
        t = o["t"]
        if o["s"] == "gps":
            gps.append(o)
        elif "ax" in o:
            accel.append(o)
        elif "lax" in o:
            uaccel.append(o)
        elif "gx" in o:
            gyro.append(o)

# Total acceleration magnitude in G (gravity included)
G0 = 9.80665
for a in accel:
    a["g"] = math.sqrt(a["ax"]**2 + a["ay"]**2 + a["az"]**2) / G0

# GPS speed in km/h
for p in gps:
    p["kmh"] = p["spd"] * 3.6

print(meta["device"], len(gps), "GPS fixes,", len(accel), "accel samples")

Handy conversions:

Pandas tip: read with pandas.read_json(path, lines=True), drop the first (meta) row, then split by the presence of columns (ax, lax, gx, lat).


Permissions

You can revoke any permission in system settings; features that depend on it stop until you grant it again.


Free vs Pro

  Free Pro (one-time)
Recording (Sport & Travel modes) Foreground + Background
Saved logs Latest 3 + Unlimited
Map / G-G / attitude / journey playback ✓ Full ✓ Full
Share raw & GPX/KML export

Pro is a one-time purchase — ¥1,000 / US$6.99. No subscription. Restore a previous purchase from the paywall (tap Pro, then Restore).