Flight View

Live glider tracking

Public Access

The broadcaster publishes uniform WebSocket channels. Every client on the same channel receives the same telemetry stream. No per-user filtering is applied.

WebSocket endpoint

ws://localhost:8080/public/ogn

Authentication is required unless the server runs with AUTH_DISABLED=true. Provide a JWT via Authorization: Bearer <token> or ?token=<token>.

Reference client

const ws = new WebSocket('ws://localhost:8080/public/ogn');
ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  if (data.type === 'hb') return; // heartbeat every ~25s
  if (data.v !== 'telemetry_v1') return;
  console.log(data);
};

Available channels

PathScopeNotes
/public/ognGlobalAll aircraft, no geographic filter.
/public/ogn/europeRegionalEurope bounds.
/public/ogn/africaRegionalAfrica bounds.
/public/ogn/oceaniaRegionalOceania bounds.
/public/ogn/south-americaRegionalSouth America bounds.
/public/ogn/north-americaRegionalNorth America bounds.
/public/ogn/competition/:idCompetitionDynamic channel with competition bounds and thermal-only filtering.

Schema (TelemetryEventV1)

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "TelemetryEventV1",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "v",
    "ts",
    "addr",
    "lat",
    "lon"
  ],
  "properties": {
    "v": {
      "const": "telemetry_v1"
    },
    "ts": {
      "type": "string",
      "description": "ISO 8601 UTC timestamp"
    },
    "addr": {
      "type": "string"
    },
    "lat": {
      "type": "number"
    },
    "lon": {
      "type": "number"
    },
    "alt_msl": {
      "type": "number"
    },
    "gs_kmh": {
      "type": "number"
    },
    "track_deg": {
      "type": "number"
    },
    "vario_ms": {
      "type": "number"
    },
    "aircraft_type": {
      "enum": [
        "glider",
        "tow",
        "helicopter",
        "parachute",
        "drop_plane",
        "hang_glider",
        "paraglider",
        "powered",
        "jet",
        "balloon",
        "uav",
        "unknown"
      ]
    },
    "privacy": {
      "type": "boolean"
    },
    "source": {
      "const": "OGN"
    },
    "turn_rate_rot": {
      "type": "number"
    },
    "receiver": {
      "type": "string"
    },
    "signal_db": {
      "type": "number"
    },
    "callsign": {
      "type": "string"
    },
    "gps_accuracy": {
      "type": "string"
    },
    "registration": {
      "type": "string"
    },
    "cn": {
      "type": "string"
    },
    "aircraft_model": {
      "type": "string"
    }
  }
}

Example payload

{
  "v": "telemetry_v1",
  "ts": "2026-02-08T20:00:00Z",
  "addr": "D-1234",
  "lat": 46.9,
  "lon": 7.4,
  "alt_msl": 1250,
  "gs_kmh": 120,
  "track_deg": 90,
  "vario_ms": 1.5,
  "aircraft_type": "glider",
  "source": "OGN",
  "registration": "HB-1234",
  "cn": "AB",
  "aircraft_model": "Ventus 3"
}

HTTP endpoints

EndpointPurpose
GET /healthBroadcaster + Redis health.
GET /channelsList active broadcast channels.
GET /historyHistorical tracks with optional region/type/speed/age filters.
GET /weatherOpen-Meteo weather proxy.

HTTP endpoints are CORS-enabled (Access-Control-Allow-Origin: *).

History endpoint example

/history?region=europe&maxAge=120&maxSpeed=300
{
  "addr": "D-1234",
  "points": [
    {
      "ts": "2026-02-08T19:58:00Z",
      "lat": 46.8941,
      "lon": 7.4012,
      "alt_msl": 1175,
      "gs_kmh": 108,
      "track_deg": 82,
      "vario_ms": 0.8,
      "aircraft_type": "glider"
    }
  ],
  "departure_place": "Belp, Bern",
  "departure_lat": 46.9134,
  "departure_lon": 7.4991,
  "registration": "HB-1234",
  "cn": "AB",
  "aircraft_model": "Ventus 3",
  "dist_km": 118.2,
  "avg_speed_kmh": 92.4
}

/history returns per-aircraft point arrays plus metadata such as departure, DDB fields, and aggregate flight stats.