at.adsb.receiver.sighting

adsb.at

Schema Diff

+48 -41

From

CID
bafyreihgoc5ebgc...
Indexed At
2026-05-23 21:30 UTC
View this version

To

CID
bafyreigfusjjsxx...
Indexed At
2026-05-25 20:10 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

18 breaking changes, 21 non-breaking changes.

Breaking Changes (18)
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.callsign" }
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.firstSeen" }
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.icaoHex" }
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.lastSeen" }
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.maxRangeNm" }
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.messageCount" }
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.positionCount" }
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.track" }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.callsign", kind: "prop", name: Some("callsign") }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.firstSeen", kind: "prop", name: Some("firstSeen") }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.icaoHex", kind: "prop", name: Some("icaoHex") }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.lastSeen", kind: "prop", name: Some("lastSeen") }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.maxRangeNm", kind: "prop", name: Some("maxRangeNm") }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.messageCount", kind: "prop", name: Some("messageCount") }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.positionCount", kind: "prop", name: Some("positionCount") }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.track", kind: "prop", name: Some("track") }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex", sort: "minLength", value: "6" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex", sort: "maxLength", value: "6" }
Non-Breaking Changes (21)
  • AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting#manifestEntry" }
  • AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex" }
  • AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.manifest" }
  • AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.manifest:items" }
  • AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.rawCapture" }
  • AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.telemetry" }
  • AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.windowEnd" }
  • AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.windowStart" }
  • AddedEdge AddedEdge { src: "at.adsb.receiver.sighting#manifestEntry", tgt: "at.adsb.receiver.sighting#manifestEntry.icaoHex", kind: "prop", name: Some("icaoHex") }
  • AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.manifest", kind: "prop", name: Some("manifest") }
  • AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.rawCapture", kind: "prop", name: Some("rawCapture") }
  • AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.telemetry", kind: "prop", name: Some("telemetry") }
  • AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowEnd", kind: "prop", name: Some("windowEnd") }
  • AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowStart", kind: "prop", name: Some("windowStart") }
  • AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body.manifest", tgt: "at.adsb.receiver.sighting:body.manifest:items", kind: "items", name: None }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.positionCount", sort: "minimum" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.messageCount", sort: "minimum" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.callsign", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.icaoHex", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.icaoHex", sort: "minLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.maxRangeNm", sort: "maxLength" }

Migration Guidance

Removed Elements

  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.callsign" }
  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.firstSeen" }
  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.icaoHex" }
  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.lastSeen" }
  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.maxRangeNm" }
  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.messageCount" }
  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.positionCount" }
  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.track" }

Added Elements

  • AddedVertex { vertex_id: "at.adsb.receiver.sighting#manifestEntry" }
  • AddedVertex { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex" }
  • AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.manifest" }
  • AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.manifest:items" }
  • AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.rawCapture" }
  • AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.telemetry" }
  • AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.windowEnd" }
  • AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.windowStart" }

Constraint Changes

  • ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex", sort: "maxLength", value: "6" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex", sort: "minLength", value: "6" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.messageCount", sort: "minimum" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.maxRangeNm", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.callsign", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.positionCount", sort: "minimum" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.icaoHex", sort: "minLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.icaoHex", sort: "maxLength" }

Additional Notes

  • Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.callsign", kind: "prop", name: Some("callsign") }
  • Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.firstSeen", kind: "prop", name: Some("firstSeen") }
  • Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.icaoHex", kind: "prop", name: Some("icaoHex") }
  • Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.lastSeen", kind: "prop", name: Some("lastSeen") }
  • Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.maxRangeNm", kind: "prop", name: Some("maxRangeNm") }
  • Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.messageCount", kind: "prop", name: Some("messageCount") }
  • Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.positionCount", kind: "prop", name: Some("positionCount") }
  • Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.track", kind: "prop", name: Some("track") }
  • Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting#manifestEntry", tgt: "at.adsb.receiver.sighting#manifestEntry.icaoHex", kind: "prop", name: Some("icaoHex") }
  • Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.manifest", kind: "prop", name: Some("manifest") }
  • Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.rawCapture", kind: "prop", name: Some("rawCapture") }
  • Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.telemetry", kind: "prop", name: Some("telemetry") }
  • Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowEnd", kind: "prop", name: Some("windowEnd") }
  • Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowStart", kind: "prop", name: Some("windowStart") }
  • Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body.manifest", tgt: "at.adsb.receiver.sighting:body.manifest:items", kind: "items", name: None }
1 1
{
2 2
  "id": "at.adsb.receiver.sighting",
3 3
  "defs": {
4 4
    "main": {
5 5
      "key": "tid",
6 6
      "type": "record",
7 7
      "record": {
8 8
        "type": "object",
9 9
        "required": [
10 -
          "icaoHex",
11 -
          "firstSeen",
12 -
          "lastSeen",
10 +
          "windowStart",
11 +
          "windowEnd",
12 +
          "manifest",
13 +
          "telemetry",
13 14
          "createdAt"
14 15
        ],
15 16
        "properties": {
16 -
          "track": {
17 +
          "manifest": {
18 +
            "type": "array",
19 +
            "items": {
20 +
              "ref": "#manifestEntry",
21 +
              "type": "ref"
22 +
            },
23 +
            "maxLength": 1000,
24 +
            "minLength": 1,
25 +
            "description": "Lightweight list of all aircraft observed in this window."
26 +
          },
27 +
          "createdAt": {
28 +
            "type": "string",
29 +
            "format": "datetime"
30 +
          },
31 +
          "telemetry": {
17 32
            "type": "blob",
18 33
            "accept": [
19 -
              "application/json",
20 34
              "application/zstd"
21 35
            ],
22 36
            "maxSize": 2000000,
23 -
            "description": "Position track as a JSON array of at.adsb.flight.defs#position objects, optionally compressed. This is the receiver's partial view of the flight."
24 -
          },
25 -
          "icaoHex": {
26 -
            "type": "string",
27 -
            "maxLength": 6,
28 -
            "minLength": 6,
29 -
            "description": "ICAO 24-bit aircraft address in hexadecimal (e.g. 'A1B2C3')."
37 +
            "description": "Zstd-compressed JSON object keyed by ICAO hex, values are arrays of at.adsb.flight.defs#position objects."
30 38
          },
31 -
          "callsign": {
39 +
          "windowEnd": {
32 40
            "type": "string",
33 -
            "maxLength": 8,
34 -
            "description": "Flight callsign as broadcast (e.g. 'UAL123')."
35 -
          },
36 -
          "lastSeen": {
37 -
            "type": "string",
38 41
            "format": "datetime",
39 -
            "description": "When this receiver last detected the aircraft."
42 +
            "description": "End of the observation window (exclusive)."
40 43
          },
41 -
          "createdAt": {
42 -
            "type": "string",
43 -
            "format": "datetime"
44 +
          "rawCapture": {
45 +
            "type": "blob",
46 +
            "accept": [
47 +
              "application/vnd.at-adsb.raw-capture+zstd"
48 +
            ],
49 +
            "maxSize": 2000000,
50 +
            "description": "Raw demodulated SDR frames captured during this window, in ATRX envelope format. Optional — strengthens provenance but not required."
44 51
          },
45 -
          "firstSeen": {
52 +
          "windowStart": {
46 53
            "type": "string",
47 54
            "format": "datetime",
48 -
            "description": "When this receiver first detected the aircraft."
49 -
          },
50 -
          "maxRangeNm": {
51 -
            "type": "string",
52 -
            "maxLength": 20,
53 -
            "description": "Furthest distance to this aircraft during the sighting, in nautical miles."
54 -
          },
55 -
          "messageCount": {
56 -
            "type": "integer",
57 -
            "minimum": 0,
58 -
            "description": "Total messages received from this aircraft."
59 -
          },
60 -
          "positionCount": {
61 -
            "type": "integer",
62 -
            "minimum": 0,
63 -
            "description": "Number of position reports received."
55 +
            "description": "Start of the observation window (inclusive)."
64 56
          }
65 57
        }
66 58
      },
67 -
      "description": "A receiver's sighting of an aircraft transit through its coverage area."
59 +
      "description": "A receiver's batch sighting covering a configurable observation window."
60 +
    },
61 +
    "manifestEntry": {
62 +
      "type": "object",
63 +
      "required": [
64 +
        "icaoHex"
65 +
      ],
66 +
      "properties": {
67 +
        "icaoHex": {
68 +
          "type": "string",
69 +
          "maxLength": 6,
70 +
          "minLength": 6,
71 +
          "description": "ICAO 24-bit hex address (uppercased)."
72 +
        }
73 +
      },
74 +
      "description": "An aircraft observed in this batch window."
68 75
    }
69 76
  },
70 77
  "$type": "com.atproto.lexicon.schema",
71 78
  "lexicon": 1,
72 -
  "description": "A single receiver's sighting of an aircraft. Created when the aircraft leaves the receiver's coverage area. Feeder-authoritative — published immediately without waiting for the full flight to complete."
79 +
  "description": "A batch of aircraft observations from a single receiver covering a configurable time window (default 60 seconds). Contains a manifest of observed aircraft and blobbed telemetry data."
73 80
}

Compare Other Versions

Lexicon Garden

@