Skip to content

Flight Track Recorder

The track recorder captures your ownship position from the live ADS-B feed every two seconds while you're flying, automatically segments by takeoff and landing, and uploads completed flights to your AZSuite logbook.

It runs passively — open the app once, the recorder is on. Take off, fly, land. When you land it auto-stops, detects departure and destination airports, and the flight appears in your "Pending Tracks" list.

How it works

The recorder is a global service inside the app (not just one screen). Once you log in, it's listening to whatever the ADS-B receiver is producing. The state machine is:

idle  ─── GS ≥ 30 kts + valid GPS fix ──→  recording
                          ┌──────────────────┘
                  records every 2 sec
           GS < 5 kts for 60 sec    ─→  idle (flight complete)
                  OR
           no GPS fix for 120 sec   ─→  idle (flight complete)

Open the recorder tile to see live status:

  • Idle — waiting for flight; status card explains the trigger conditions
  • Recording — red border, live elapsed time, point count, distance, max altitude, max ground speed
  • The big button at the bottom of the card flips between ▶ Start Recording and ■ Stop Recording (manual override; the recorder normally manages itself)

The "● REC" strip

When recording is active, a thin red strip appears across the top of every screen — including the dashboard, ADS-B radar, weather, anywhere you navigate in the app. It shows:

● REC  0:14:32  ·  185 pts  ·  18.4 NM    Tap →

Tap the strip to jump to the recorder screen.

This is your "yes, my flight is being recorded" reassurance. If you don't see it, recording isn't active.

What gets captured

Every 2 seconds the recorder samples:

  • Lat / Lon (GPS-precise)
  • Barometric altitude (from the ownship message, refreshed every second)
  • Geometric altitude (from the optional ownship-geo-altitude message — WGS-84)
  • Ground speed
  • Track (true ground track in degrees)
  • Vertical speed (FPM)

These fields go into a local SQLite buffer that lives on the device until you upload (or delete) the track.

Auto-discard rules

A track is discarded (silently dropped) if it's:

  • Fewer than 10 sample points (less than ~20 seconds)
  • OR less than 0.5 NM of cumulative ground distance

This prevents creating logbook clutter from a runup or a brief taxi back after an aborted takeoff.

Discarded tracks still appear in the list with a "discarded" status pill — useful diagnostic, but they can't be uploaded.

Auto-detect departure / destination

When a flight closes, the recorder runs airport detection:

  1. Look at the first GPS fix — find the nearest airport within 3 NM where the airport's elevation is within ±800 ft of the point altitude
  2. Same for the last GPS fix — that's your destination
  3. Both written into the track row as ICAO idents (e.g., KZPH, KORL)

Backed by a bundled airport database with 16,201 US small / medium / large airports (from OurAirports.com). Heliports and seaplane bases are excluded — they cluster near runways and would trick the lookup.

If detection fails (e.g., you started recording mid-cruise above 5000 ft, no airport within 3 NM), the field is left null and a ↻ Re-detect airports button appears on the track row. Tap to retry — useful after a manual edit or when the bundle's been updated.

You can also override the detected airports manually before upload (planned — see Tip below).

Manual override

Detection is right ~95% of the time; the 5% are edge cases like grass strips not in the database, or finals at the end of a long flight that landed at a satellite airport. For now you upload with what detection found and edit on the web if needed.

Pending Tracks list

Below the status card the recorder screen shows every track ever recorded on this device. Each row shows:

  • ICAO codes (KZPH → KORL)
  • City names (from the airport bundle: "Zephyrhills → Orlando Executive Airport")
  • Date + time range, duration
  • Distance + point count + max altitude
  • Status pill: RECORDING / pending / uploading / uploaded / failed / discarded

Long-press a row to delete it (with confirmation).

Upload to AZSuite

Each completed track has an ↑ Upload button. Tap it to:

  1. Pick the aircraft (if not already attached) — picker shows up to 5 of your aircraft as Alert buttons
  2. The track + every point + dep/dest airports + device fingerprint POSTs to AZSuite
  3. The server returns a server_track_id — that's the row in your AZSuite adsb_flights table
  4. Status pill flips to uploaded

The upload is idempotent — tap it twice, the second call returns the same ID with duplicate: true. No double-uploads.

If the upload fails (server unreachable, expired token), the row shows a ↻ Retry upload button with the error message inline.

Once uploaded

The flight appears in:

  • The web pilot_logbook.php "Save and Log Track" track picker — link any pilot logbook entry to the track
  • The flight track replay viewer — visualize the recorded path
  • The aircraft's track history (per-aircraft list)

What it doesn't do (yet)

  • Background recording when the app is closed — iOS doesn't allow continuous UDP listening when backgrounded. You need to keep the app foregrounded (any tile is fine) for recording to continue. Mount the phone on a kneeboard, lock the screen with expo-keep-awake engaged, and you're good for the duration.
  • Recording without ADS-B — the recorder feeds off the live GDL90 stream. Without a Stratux or GTX-345 on Wi-Fi, there's nothing to record. (A future "GPS-only" mode using the phone's own location services is on the roadmap.)
  • Live streaming — the recorder uploads at flight close, not in real time. By design — your data is on the device until you choose to share it.

Privacy

Tracks live on your device until you upload them. Upload is opt-in per-track. Once uploaded, you control whether they're public or private via your AZSuite privacy settings.