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": {
          "clonedFrom": {
            "description": "Optional reference to the activity this record was saved from (Save as My Activity). The AppView checks the source's reuse rules at index time and hides this record's geometry and co-athlete link when they are not met.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "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
bafyreihbulb2qe5hf7orfvbrovbfocys5qwhqr6xsyc6pck5fzisgio5bi
Indexed At
2026-10-04 16:30 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

@