world.treeline.activity.record

treeline.world

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "deviceMetadata": {
      "description": "Metadata about the recording hardware or sensor device.",
      "properties": {
        "manufacturer": {
          "description": "Manufacturer name (e.g. Garmin, Wahoo, COROS, Apple).",
          "maxLength": 100,
          "type": "string"
        },
        "model": {
          "description": "Device model name (e.g. Forerunner 965, ELEMNT BOLT, Apple Watch Ultra).",
          "maxLength": 100,
          "type": "string"
        }
      },
      "type": "object"
    },
    "geometry": {
      "description": "Simplified GeoJSON LineString geometry representing the activity path.",
      "properties": {
        "coordinates": {
          "description": "RDP-simplified array of coordinate tuples [lon, lat, ele?].",
          "items": {
            "type": "unknown"
          },
          "maxLength": 500,
          "type": "array"
        },
        "type": {
          "const": "LineString",
          "description": "GeoJSON geometry type specifier.",
          "type": "string"
        }
      },
      "required": [
        "type",
        "coordinates"
      ],
      "type": "object"
    },
    "main": {
      "description": "A sports activity or outdoor adventure record logged on Treeline.",
      "key": "tid",
      "record": {
        "properties": {
          "coAthletes": {
            "description": "DIDs of athletes who participated in this activity together.",
            "items": {
              "format": "did",
              "type": "string"
            },
            "maxLength": 50,
            "type": "array"
          },
          "createdAt": {
            "description": "Record creation timestamp on client/PDS (ISO 8601 UTC format).",
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "description": "Detailed notes, trip report, weather observations, or gear notes.",
            "maxGraphemes": 3000,
            "maxLength": 30000,
            "type": "string"
          },
          "deviceInfo": {
            "description": "Recording hardware or sensor device metadata.",
            "ref": "#deviceMetadata",
            "type": "ref"
          },
          "endedAt": {
            "description": "Timestamp when the activity finished (ISO 8601 UTC format).",
            "format": "datetime",
            "type": "string"
          },
          "gearRef": {
            "description": "Optional reference to a world.treeline.gear.item used in this activity.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "geometry": {
            "description": "Simplified GeoJSON LineString path (recommended <= 250 points) for lightweight relay and feed distribution.",
            "ref": "#geometry",
            "type": "ref"
          },
          "hideStartEndMeters": {
            "description": "Distance trimmed from each end of the public preview only. The original telemetry blob remains untrimmed and publicly retrievable.",
            "maximum": 100000,
            "minimum": 0,
            "type": "integer"
          },
          "privacy": {
            "default": "public",
            "description": "AppView visibility, not confidentiality of the public repository or original blob. New clients publish public or unlisted; unsupported restricted values must fail closed.",
            "knownValues": [
              "public",
              "unlisted",
              "followers",
              "private",
              "permissioned"
            ],
            "type": "string"
          },
          "rawBlob": {
            "accept": [
              "application/gpx+xml",
              "application/vnd.ant.fit",
              "application/vnd.garmin.tcx+xml",
              "application/octet-stream",
              "application/xml",
              "text/xml"
            ],
            "description": "Full-resolution original raw telemetry file (.fit, .gpx, .tcx) stored directly as an ATProto blob on the athlete's PDS.",
            "maxSize": 52428800,
            "type": "blob"
          },
          "route": {
            "description": "Optional reference to a world.treeline.route.record course or trail guide followed.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "routeRef": {
            "description": "Optional reference to a world.treeline.route.record followed.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "sport": {
            "description": "Sport or activity type category.",
            "knownValues": [
              "run",
              "trail_run",
              "walk",
              "hike",
              "ride",
              "mountain_bike",
              "gravel_ride",
              "e_bike",
              "road_bike",
              "handcycle",
              "ski",
              "snowboard",
              "backcountry_ski",
              "nordic_ski",
              "roller_ski",
              "swim",
              "open_water_swim",
              "kayak",
              "canoe",
              "rowing",
              "paddleboard",
              "surf",
              "kitesurf",
              "windsurf",
              "sail",
              "climb",
              "boulder",
              "mountaineering",
              "wheelchair",
              "workout",
              "yoga",
              "crossfit",
              "weight_training",
              "pilates",
              "hiit",
              "other"
            ],
            "type": "string"
          },
          "startedAt": {
            "description": "Timestamp when the activity started (ISO 8601 UTC format).",
            "format": "datetime",
            "type": "string"
          },
          "stats": {
            "description": "Summary metrics and telemetry statistics for the activity.",
            "ref": "#stats",
            "type": "ref"
          },
          "tags": {
            "description": "Categorization tags (e.g. race, commute, intervals, summits).",
            "items": {
              "maxLength": 64,
              "type": "string"
            },
            "maxLength": 20,
            "type": "array"
          },
          "title": {
            "description": "Display title of the activity (e.g., Morning Trail Run, Grand Canyon R2R2R).",
            "maxGraphemes": 300,
            "maxLength": 3000,
            "type": "string"
          }
        },
        "required": [
          "title",
          "sport",
          "startedAt",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "stats": {
      "description": "Summary telemetry metrics calculated from the raw activity dataset.",
      "properties": {
        "averageCadenceRpm": {
          "description": "[Deprecated: use avgCadence] Average cadence in rpm or spm.",
          "minimum": 0,
          "type": "integer"
        },
        "averageHeartRateBpm": {
          "description": "[Deprecated: use avgHeartRateBpm] Average heart rate in beats per minute.",
          "maximum": 300,
          "minimum": 0,
          "type": "integer"
        },
        "averagePowerWatts": {
          "description": "[Deprecated: use avgPowerWatts] Average power output in watts.",
          "minimum": 0,
          "type": "integer"
        },
        "averageSpeedMps": {
          "description": "[Deprecated: use avgSpeedMps] Average moving speed in meters per second.",
          "type": "unknown"
        },
        "avgCadence": {
          "description": "Mean cadence (rpm or spm).",
          "minimum": 0,
          "type": "integer"
        },
        "avgCadenceRpm": {
          "description": "Mean cadence in revolutions or steps per minute.",
          "minimum": 0,
          "type": "integer"
        },
        "avgHeartRateBpm": {
          "description": "Mean heart rate in beats per minute.",
          "maximum": 300,
          "minimum": 0,
          "type": "integer"
        },
        "avgPowerWatts": {
          "description": "Mean power output in watts from a recorded sensor.",
          "minimum": 0,
          "type": "integer"
        },
        "avgSpeedMps": {
          "description": "Calculated mean moving speed in meters per second.",
          "type": "unknown"
        },
        "calories": {
          "description": "Estimated energy expenditure in kilocalories.",
          "minimum": 0,
          "type": "integer"
        },
        "distanceMeters": {
          "description": "Total distance traveled in meters.",
          "minimum": 0,
          "type": "integer"
        },
        "durationSeconds": {
          "description": "[Deprecated: use elapsedDurationSeconds] Total elapsed time in seconds.",
          "minimum": 0,
          "type": "integer"
        },
        "elapsedDurationSeconds": {
          "description": "Total elapsed time including pauses in seconds.",
          "minimum": 0,
          "type": "integer"
        },
        "elevationGainMeters": {
          "description": "Cumulative elevation gain in meters.",
          "minimum": 0,
          "type": "integer"
        },
        "elevationLossMeters": {
          "description": "Cumulative elevation loss in meters.",
          "minimum": 0,
          "type": "integer"
        },
        "energyKilojoules": {
          "description": "Total mechanical work in kilojoules (session.total_work or avgPowerWatts * movingDurationSeconds / 1000).",
          "minimum": 0,
          "type": "integer"
        },
        "maxHeartRateBpm": {
          "description": "Maximum recorded heart rate in beats per minute.",
          "maximum": 300,
          "minimum": 0,
          "type": "integer"
        },
        "maxPowerWatts": {
          "description": "Maximum power output in watts.",
          "minimum": 0,
          "type": "integer"
        },
        "maxSpeedMps": {
          "description": "Maximum recorded speed in meters per second.",
          "type": "unknown"
        },
        "movingDurationSeconds": {
          "description": "Active moving duration excluding pauses in seconds.",
          "minimum": 0,
          "type": "integer"
        },
        "movingTimeSeconds": {
          "description": "[Deprecated: use movingDurationSeconds] Total moving time excluding pauses in seconds.",
          "minimum": 0,
          "type": "integer"
        },
        "temperatureCelsius": {
          "description": "Average ambient temperature in degrees Celsius.",
          "type": "integer"
        }
      },
      "type": "object"
    }
  },
  "id": "world.treeline.activity.record",
  "lexicon": 1
}

Validate Record

Validate a record against world.treeline.activity.record

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:sjejpugpajgvxweilujzjcmq
CID
bafyreigorvbwt34jctsshbkecjpbccdq2vvpa3xm54ebt3xmrensk2bkfm
Indexed At
2026-10-03 15:08 UTC
AT-URI
at://did:plc:sjejpugpajgvxweilujzjcmq/com.atproto.lexicon.schema/world.treeline.activity.record

Version History (3 versions)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • A recorded physical activity such as a bike ride.

  • PROVISIONAL: activities are generic enough that they belong in a community-driven lexicon rather than an app namespace. When a community schema stabilizes, Kimbia will migrate to it and deprecate this one in its favor.

  • A recording of an activity. Like running, walking, lifting weights, etc. Helpful to create the rkey tid from the start time and clock id 23 so you can upsert easily.

  • A fitness workout record

  • A curated trail guide, course, or route record published on Treeline.

Lexicon Garden

@