app.thedistance.activity

thedistance.app

Schema Diff

+116 -0

From

CID
bafyreiazfmrunst...
Indexed At
2026-05-30 19:15 UTC
View this version

To

CID
bafyreichqq37dzv...
Indexed At
2026-05-30 19:51 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 46 non-breaking changes.

Non-Breaking Changes (46)
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.apparentTemperature" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.avgTemperature" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.cloudCover" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.condition" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.dewpoint" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.humidity" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.maxTemperature" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.precipitationIntensity" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.precipitationProbability" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.precipitationType" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.pressure" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.temperature" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.uvIndex" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.visibility" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.windBearing" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.windGust" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity#weather.windSpeed" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity:body.elevationLoss" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity:body.perceivedExertion" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity:body.totalWork" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity:body.weather" }
  • AddedVertex AddedVertex { vertex_id: "app.thedistance.activity:body.weightedAvgPower" }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.apparentTemperature", kind: "prop", name: Some("apparentTemperature") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.avgTemperature", kind: "prop", name: Some("avgTemperature") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.cloudCover", kind: "prop", name: Some("cloudCover") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.condition", kind: "prop", name: Some("condition") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.dewpoint", kind: "prop", name: Some("dewpoint") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.humidity", kind: "prop", name: Some("humidity") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.maxTemperature", kind: "prop", name: Some("maxTemperature") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.precipitationIntensity", kind: "prop", name: Some("precipitationIntensity") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.precipitationProbability", kind: "prop", name: Some("precipitationProbability") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.precipitationType", kind: "prop", name: Some("precipitationType") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.pressure", kind: "prop", name: Some("pressure") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.temperature", kind: "prop", name: Some("temperature") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.uvIndex", kind: "prop", name: Some("uvIndex") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.visibility", kind: "prop", name: Some("visibility") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.windBearing", kind: "prop", name: Some("windBearing") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.windGust", kind: "prop", name: Some("windGust") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.windSpeed", kind: "prop", name: Some("windSpeed") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.elevationLoss", kind: "prop", name: Some("elevationLoss") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.perceivedExertion", kind: "prop", name: Some("perceivedExertion") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.totalWork", kind: "prop", name: Some("totalWork") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.weather", kind: "prop", name: Some("weather") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.weightedAvgPower", kind: "prop", name: Some("weightedAvgPower") }
  • AddedEdge AddedEdge { src: "app.thedistance.activity:body.weather", tgt: "app.thedistance.activity#weather", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "app.thedistance.activity#weather" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.apparentTemperature" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.avgTemperature" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.cloudCover" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.condition" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.dewpoint" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.humidity" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.maxTemperature" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.precipitationIntensity" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.precipitationProbability" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.precipitationType" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.pressure" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.temperature" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.uvIndex" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.visibility" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.windBearing" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.windGust" }
  • AddedVertex { vertex_id: "app.thedistance.activity#weather.windSpeed" }
  • AddedVertex { vertex_id: "app.thedistance.activity:body.elevationLoss" }
  • AddedVertex { vertex_id: "app.thedistance.activity:body.perceivedExertion" }
  • AddedVertex { vertex_id: "app.thedistance.activity:body.totalWork" }
  • AddedVertex { vertex_id: "app.thedistance.activity:body.weather" }
  • AddedVertex { vertex_id: "app.thedistance.activity:body.weightedAvgPower" }

Additional Notes

  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.apparentTemperature", kind: "prop", name: Some("apparentTemperature") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.avgTemperature", kind: "prop", name: Some("avgTemperature") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.cloudCover", kind: "prop", name: Some("cloudCover") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.condition", kind: "prop", name: Some("condition") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.dewpoint", kind: "prop", name: Some("dewpoint") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.humidity", kind: "prop", name: Some("humidity") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.maxTemperature", kind: "prop", name: Some("maxTemperature") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.precipitationIntensity", kind: "prop", name: Some("precipitationIntensity") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.precipitationProbability", kind: "prop", name: Some("precipitationProbability") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.precipitationType", kind: "prop", name: Some("precipitationType") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.pressure", kind: "prop", name: Some("pressure") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.temperature", kind: "prop", name: Some("temperature") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.uvIndex", kind: "prop", name: Some("uvIndex") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.visibility", kind: "prop", name: Some("visibility") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.windBearing", kind: "prop", name: Some("windBearing") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.windGust", kind: "prop", name: Some("windGust") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity#weather", tgt: "app.thedistance.activity#weather.windSpeed", kind: "prop", name: Some("windSpeed") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.elevationLoss", kind: "prop", name: Some("elevationLoss") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.perceivedExertion", kind: "prop", name: Some("perceivedExertion") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.totalWork", kind: "prop", name: Some("totalWork") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.weather", kind: "prop", name: Some("weather") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity:body", tgt: "app.thedistance.activity:body.weightedAvgPower", kind: "prop", name: Some("weightedAvgPower") }
  • Non-breaking: AddedEdge { src: "app.thedistance.activity:body.weather", tgt: "app.thedistance.activity#weather", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "aspectRatio": {
5 5
      "description": "Width and height of the image, used for layout before the image loads.",
6 6
      "properties": {
7 7
        "height": {
8 8
          "minimum": 1,
9 9
          "type": "integer"
10 10
        },
11 11
        "width": {
12 12
          "minimum": 1,
13 13
          "type": "integer"
14 14
        }
15 15
      },
16 16
      "required": [
17 17
        "width",
18 18
        "height"
19 19
      ],
20 20
      "type": "object"
21 21
    },
22 22
    "image": {
23 23
      "properties": {
24 24
        "alt": {
25 25
          "description": "Alt text for the image.",
26 26
          "maxLength": 3000,
27 27
          "type": "string"
28 28
        },
29 29
        "aspectRatio": {
30 30
          "ref": "#aspectRatio",
31 31
          "type": "ref"
32 32
        },
33 33
        "image": {
34 34
          "accept": [
35 35
            "image/jpeg",
36 36
            "image/png",
37 37
            "image/webp"
38 38
          ],
39 39
          "maxSize": 10000000,
40 40
          "type": "blob"
41 41
        }
42 42
      },
43 43
      "required": [
44 44
        "image"
45 45
      ],
46 46
      "type": "object"
47 47
    },
48 48
    "main": {
49 49
      "description": "A recorded physical activity such as a bike ride.",
50 50
      "key": "tid",
51 51
      "record": {
52 52
        "properties": {
53 53
          "avgCadence": {
54 54
            "description": "Average cadence in revolutions per minute.",
55 55
            "minimum": 0,
56 56
            "type": "integer"
57 57
          },
58 58
          "avgHeartRate": {
59 59
            "description": "Average heart rate in beats per minute.",
60 60
            "minimum": 0,
61 61
            "type": "integer"
62 62
          },
63 63
          "avgPower": {
64 64
            "description": "Average power output in watts.",
65 65
            "minimum": 0,
66 66
            "type": "integer"
67 67
          },
68 68
          "avgSpeed": {
69 69
            "description": "Average speed in meters per second. String-encoded decimal number.",
70 70
            "maxLength": 64,
71 71
            "type": "string"
72 72
          },
73 73
          "calories": {
74 74
            "description": "Estimated calories burned.",
75 75
            "minimum": 0,
76 76
            "type": "integer"
77 77
          },
78 78
          "createdAt": {
79 79
            "description": "Timestamp of when this record was created.",
80 80
            "format": "datetime",
81 81
            "type": "string"
82 82
          },
83 83
          "description": {
84 84
            "description": "User-provided description of the activity.",
85 85
            "maxLength": 3000,
86 86
            "type": "string"
87 87
          },
88 88
          "device": {
89 89
            "description": "Name of the device that recorded the activity.",
90 90
            "maxLength": 300,
91 91
            "type": "string"
92 92
          },
93 93
          "distance": {
94 94
            "description": "Total distance in meters. String-encoded decimal number, e.g. '51214.6'.",
95 95
            "maxLength": 64,
96 96
            "type": "string"
97 97
          },
98 98
          "elapsedTime": {
99 99
            "description": "Total elapsed time in seconds, including stopped time.",
100 100
            "minimum": 0,
101 101
            "type": "integer"
102 102
          },
103 103
          "elevationGain": {
104 104
            "description": "Total elevation gain in meters. String-encoded decimal number.",
105 105
            "maxLength": 64,
106 106
            "type": "string"
107 107
          },
108 +
          "elevationLoss": {
109 +
            "description": "Total elevation loss in meters. String-encoded decimal number.",
110 +
            "maxLength": 64,
111 +
            "type": "string"
112 +
          },
108 113
          "images": {
109 114
            "description": "Photos from the activity.",
110 115
            "items": {
111 116
              "ref": "#image",
112 117
              "type": "ref"
113 118
            },
114 119
            "maxLength": 8,
115 120
            "type": "array"
116 121
          },
117 122
          "maxCadence": {
118 123
            "description": "Maximum cadence in revolutions per minute.",
119 124
            "minimum": 0,
120 125
            "type": "integer"
121 126
          },
122 127
          "maxHeartRate": {
123 128
            "description": "Maximum heart rate in beats per minute.",
124 129
            "minimum": 0,
125 130
            "type": "integer"
126 131
          },
127 132
          "maxPower": {
128 133
            "description": "Maximum power output in watts.",
129 134
            "minimum": 0,
130 135
            "type": "integer"
131 136
          },
132 137
          "maxSpeed": {
133 138
            "description": "Maximum speed in meters per second. String-encoded decimal number.",
134 139
            "maxLength": 64,
135 140
            "type": "string"
136 141
          },
137 142
          "movingTime": {
138 143
            "description": "Time spent in motion in seconds.",
139 144
            "minimum": 0,
140 145
            "type": "integer"
141 146
          },
147 +
          "perceivedExertion": {
148 +
            "description": "Rate of perceived exertion (RPE), typically 1-10.",
149 +
            "minimum": 0,
150 +
            "type": "integer"
151 +
          },
142 152
          "polyline": {
143 153
            "description": "Encoded polyline string representing a simplified, privacy-trimmed route for map display. Uses Google's encoded polyline algorithm format. Ingestion services should simplify polylines to fit within the 20,000 byte limit. This limit may be revisited if it proves insufficient.",
144 154
            "maxLength": 20000,
145 155
            "type": "string"
146 156
          },
147 157
          "source": {
148 158
            "description": "Where the activity data was imported from.",
149 159
            "knownValues": [
150 160
              "garmin",
151 161
              "strava",
152 162
              "wahoo",
153 163
              "manual",
154 164
              "fit-file",
155 165
              "gpx-file"
156 166
            ],
157 167
            "maxLength": 128,
158 168
            "type": "string"
159 169
          },
160 170
          "sourceId": {
161 171
            "description": "Identifier for this activity in the source system, e.g. a Strava activity ID.",
162 172
            "maxLength": 256,
163 173
            "type": "string"
164 174
          },
165 175
          "sportType": {
166 176
            "description": "The type of activity.",
167 177
            "knownValues": [
168 178
              "ride"
169 179
            ],
170 180
            "maxLength": 128,
171 181
            "type": "string"
172 182
          },
173 183
          "startedAt": {
174 184
            "description": "When the activity started.",
175 185
            "format": "datetime",
176 186
            "type": "string"
177 187
          },
178 188
          "title": {
179 189
            "description": "User-provided name for the activity.",
180 190
            "maxLength": 300,
181 191
            "type": "string"
192 +
          },
193 +
          "totalWork": {
194 +
            "description": "Total mechanical work in kilojoules.",
195 +
            "minimum": 0,
196 +
            "type": "integer"
197 +
          },
198 +
          "weather": {
199 +
            "description": "Weather conditions during the activity.",
200 +
            "ref": "#weather",
201 +
            "type": "ref"
202 +
          },
203 +
          "weightedAvgPower": {
204 +
            "description": "Normalized/weighted average power in watts.",
205 +
            "minimum": 0,
206 +
            "type": "integer"
182 207
          }
183 208
        },
184 209
        "required": [
185 210
          "sportType",
186 211
          "startedAt",
187 212
          "elapsedTime",
188 213
          "movingTime",
189 214
          "distance",
190 215
          "createdAt"
191 216
        ],
192 217
        "type": "object"
193 218
      },
194 219
      "type": "record"
220 +
    },
221 +
    "weather": {
222 +
      "description": "Weather conditions observed during the activity.",
223 +
      "properties": {
224 +
        "apparentTemperature": {
225 +
          "description": "Feels-like temperature in degrees Celsius. String-encoded decimal.",
226 +
          "maxLength": 64,
227 +
          "type": "string"
228 +
        },
229 +
        "avgTemperature": {
230 +
          "description": "Average device-measured temperature in degrees Celsius. String-encoded decimal.",
231 +
          "maxLength": 64,
232 +
          "type": "string"
233 +
        },
234 +
        "cloudCover": {
235 +
          "description": "Cloud cover as a percentage. String-encoded decimal.",
236 +
          "maxLength": 64,
237 +
          "type": "string"
238 +
        },
239 +
        "condition": {
240 +
          "description": "General weather condition, e.g. 'Clear', 'Cloudy', 'Rain'.",
241 +
          "maxLength": 128,
242 +
          "type": "string"
243 +
        },
244 +
        "dewpoint": {
245 +
          "description": "Dewpoint in degrees Celsius. String-encoded decimal.",
246 +
          "maxLength": 64,
247 +
          "type": "string"
248 +
        },
249 +
        "humidity": {
250 +
          "description": "Relative humidity as a percentage. String-encoded decimal.",
251 +
          "maxLength": 64,
252 +
          "type": "string"
253 +
        },
254 +
        "maxTemperature": {
255 +
          "description": "Maximum device-measured temperature in degrees Celsius. String-encoded decimal.",
256 +
          "maxLength": 64,
257 +
          "type": "string"
258 +
        },
259 +
        "precipitationIntensity": {
260 +
          "description": "Precipitation intensity in mm/hr. String-encoded decimal.",
261 +
          "maxLength": 64,
262 +
          "type": "string"
263 +
        },
264 +
        "precipitationProbability": {
265 +
          "description": "Precipitation probability as a percentage. String-encoded decimal.",
266 +
          "maxLength": 64,
267 +
          "type": "string"
268 +
        },
269 +
        "precipitationType": {
270 +
          "description": "Type of precipitation, e.g. 'rain', 'snow', 'sleet'.",
271 +
          "maxLength": 64,
272 +
          "type": "string"
273 +
        },
274 +
        "pressure": {
275 +
          "description": "Atmospheric pressure in hPa/mbar. String-encoded decimal.",
276 +
          "maxLength": 64,
277 +
          "type": "string"
278 +
        },
279 +
        "temperature": {
280 +
          "description": "Air temperature in degrees Celsius. String-encoded decimal.",
281 +
          "maxLength": 64,
282 +
          "type": "string"
283 +
        },
284 +
        "uvIndex": {
285 +
          "description": "UV index. String-encoded decimal.",
286 +
          "maxLength": 64,
287 +
          "type": "string"
288 +
        },
289 +
        "visibility": {
290 +
          "description": "Visibility distance in kilometers. String-encoded decimal.",
291 +
          "maxLength": 64,
292 +
          "type": "string"
293 +
        },
294 +
        "windBearing": {
295 +
          "description": "Wind direction in degrees (0-360). String-encoded decimal.",
296 +
          "maxLength": 64,
297 +
          "type": "string"
298 +
        },
299 +
        "windGust": {
300 +
          "description": "Wind gust speed in meters per second. String-encoded decimal.",
301 +
          "maxLength": 64,
302 +
          "type": "string"
303 +
        },
304 +
        "windSpeed": {
305 +
          "description": "Wind speed in meters per second. String-encoded decimal.",
306 +
          "maxLength": 64,
307 +
          "type": "string"
308 +
        }
309 +
      },
310 +
      "type": "object"
195 311
    }
196 312
  },
197 313
  "id": "app.thedistance.activity",
198 314
  "lexicon": 1
199 315
}

Compare Other Versions

Lexicon Garden

@