app.thedistance.activity

thedistance.app

Schema Diff

+121 -0

From

CID
bafyreied54mn53i...
Indexed At
2026-04-20 18:27 UTC
View this version

To

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

Compatibility Analysis

Backward Compatible

Backward compatible. 48 non-breaking changes.

Non-Breaking Changes (48)
  • 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.sourceId" }
  • 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.sourceId", kind: "prop", name: Some("sourceId") }
  • 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.sourceId" }
  • 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.sourceId", kind: "prop", name: Some("sourceId") }
  • 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
          },
170 +
          "sourceId": {
171 +
            "description": "Identifier for this activity in the source system, e.g. a Strava activity ID.",
172 +
            "maxLength": 256,
173 +
            "type": "string"
174 +
          },
160 175
          "sportType": {
161 176
            "description": "The type of activity.",
162 177
            "knownValues": [
163 178
              "ride"
164 179
            ],
165 180
            "maxLength": 128,
166 181
            "type": "string"
167 182
          },
168 183
          "startedAt": {
169 184
            "description": "When the activity started.",
170 185
            "format": "datetime",
171 186
            "type": "string"
172 187
          },
173 188
          "title": {
174 189
            "description": "User-provided name for the activity.",
175 190
            "maxLength": 300,
176 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"
177 207
          }
178 208
        },
179 209
        "required": [
180 210
          "sportType",
181 211
          "startedAt",
182 212
          "elapsedTime",
183 213
          "movingTime",
184 214
          "distance",
185 215
          "createdAt"
186 216
        ],
187 217
        "type": "object"
188 218
      },
189 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"
190 311
    }
191 312
  },
192 313
  "id": "app.thedistance.activity",
193 314
  "lexicon": 1
194 315
}

Compare Other Versions

Lexicon Garden

@