app.attrails.route

attrails.app

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "commute": {
      "description": "Utility / commuting.",
      "type": "token"
    },
    "cyclingDetails": {
      "description": "Cycling-specific attributes of a route.",
      "properties": {
        "discipline": {
          "knownValues": [
            "app.attrails.route#road",
            "app.attrails.route#gravelBike",
            "app.attrails.route#mtb",
            "app.attrails.route#touring",
            "app.attrails.route#commute"
          ],
          "type": "string"
        }
      },
      "type": "object"
    },
    "gravelBike": {
      "description": "Gravel / adventure cycling.",
      "type": "token"
    },
    "main": {
      "description": "A cycling, running, hiking, walking, etc. route shared by a user. The associated track file is stored as a blob.",
      "key": "tid",
      "record": {
        "properties": {
          "activity": {
            "description": "The activity this route is intended for. Open enum; unknown values are allowed.",
            "knownValues": [
              "app.attrails.defs#cycling",
              "app.attrails.defs#running",
              "app.attrails.defs#hiking",
              "app.attrails.defs#walking",
              "app.attrails.defs#other"
            ],
            "type": "string"
          },
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "description": "Description of the route, as CommonMark markdown. Clients must not render raw HTML.",
            "maxGraphemes": 3000,
            "maxLength": 30000,
            "type": "string"
          },
          "details": {
            "description": "Activity-specific attributes. Open union: new activity detail types can be added later without breaking existing clients.",
            "refs": [
              "app.attrails.route#cyclingDetails"
            ],
            "type": "union"
          },
          "difficulty": {
            "description": "Author's subjective difficulty for the stated activity.",
            "knownValues": [
              "app.attrails.defs#easy",
              "app.attrails.defs#moderate",
              "app.attrails.defs#hard",
              "app.attrails.defs#extreme"
            ],
            "type": "string"
          },
          "images": {
            "items": {
              "ref": "app.attrails.defs#image",
              "type": "ref"
            },
            "maxLength": 10,
            "type": "array"
          },
          "labels": {
            "description": "Self-label values for this route, e.g. to flag sensitive photos.",
            "refs": [
              "com.atproto.label.defs#selfLabels"
            ],
            "type": "union"
          },
          "langs": {
            "description": "Languages of this record's text (name, description, tags, image alt text), as BCP-47 tags. If absent, consumers should assume English ('en').",
            "items": {
              "format": "language",
              "type": "string"
            },
            "maxLength": 3,
            "type": "array"
          },
          "name": {
            "description": "Name of the route.",
            "maxGraphemes": 100,
            "maxLength": 1000,
            "minLength": 1,
            "type": "string"
          },
          "surface": {
            "description": "Predominant surface. Activity-neutral.",
            "knownValues": [
              "app.attrails.defs#paved",
              "app.attrails.defs#gravel",
              "app.attrails.defs#trail",
              "app.attrails.defs#mixed"
            ],
            "type": "string"
          },
          "tags": {
            "description": "Free-form tags, stored without a leading '#'.",
            "items": {
              "maxGraphemes": 64,
              "maxLength": 640,
              "type": "string"
            },
            "maxLength": 20,
            "type": "array"
          },
          "track": {
            "accept": [
              "application/gpx+xml",
              "application/xml",
              "text/xml"
            ],
            "description": "The route's track, commonly as a GPX file. Subject to max size limitations imposed by the user's PDS, so large routes might need to be simplified or compressed to fit.",
            "maxSize": 976563,
            "type": "blob"
          }
        },
        "required": [
          "name",
          "activity",
          "track",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "mtb": {
      "description": "Mountain biking.",
      "type": "token"
    },
    "road": {
      "description": "Road cycling.",
      "type": "token"
    },
    "touring": {
      "description": "Multi-day touring / bikepacking.",
      "type": "token"
    }
  },
  "id": "app.attrails.route",
  "lexicon": 1
}

Validate Record

Validate a record against app.attrails.route

Validation Options
Automatically resolve and include external schemas for full validation
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:q7v2r4sxk4pecbwmaucvb2vn
CID
bafyreic34gtsq4kkdhtvogel3h37hgllvxs5mp4i2rmtzrjjaisi3cjyq4
Indexed At
2026-10-26 22:50 UTC
AT-URI
at://did:plc:q7v2r4sxk4pecbwmaucvb2vn/com.atproto.lexicon.schema/app.attrails.route

Referenced Schemas (2)

Similar Lexicons

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

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

  • One private GPS activity. Distance, duration, and elevation are derived by the app from the uploaded route file.

  • Width:height ratio so clients can lay out before the image loads.

  • A trail

  • 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.

Lexicon Garden

@